Python3で文章に記号があるかどうかを判定したかったが、ブラックリストにすると思ったより大変そうだったので
- 数字
- アルファベット
- 平仮名
- 片仮名
- 漢字
のいずれかのみが続く文字かどうかを判定しようとした。
はまりどころ
Unicode文字列で範囲指定することにした。(←そもそもの間違い)
Python2では、漢字は下記のようにすれば(ほぼ)判定できる。
# Python2
import re
str = 'これは漢字を含みます'
re.search('[\xE4B880-\xE98CAC]', str)
Python3では正規表現中の文法が違う。
-
\x
ではなく\u
で指定する - UTF-8ではなくUTF-16で指定する
これを踏まえると
# Python3
import re
str = 'これは漢字を含みます'
re.search('[\u4E00-\u9FD0]', str)
となる。Python2と同様に書こうとして
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-7: truncated \xXXXXXXXX escape
というエラーが出てはまった。
最後に気づいた
これでよくね?
re.search('[0-9a-zA-Zあ-んア-ン一-鿐]', str)