web-dev-qa-db-ja.com

python正規表現でのユニコード文字のマッチング

Stackoverflowで他の質問も読みましたが、まだ詳しくはありません。申し訳ありませんが、これは既に回答されていますが、提案されているものは何もありませんでした。

>>> import re
>>> m = re.match(r'^/by_tag/(?P<tag>\w+)/(?P<filename>(\w|[.,!#%{}()@])+)$', '/by_tag/xmas/xmas1.jpg')
>>> print m.groupdict()
{'tag': 'xmas', 'filename': 'xmas1.jpg'}

すべてが順調です。次に、ノルウェー語の文字を含むもの(またはよりユニコードのようなもの)を試します。

>>> m = re.match(r'^/by_tag/(?P<tag>\w+)/(?P<filename>(\w|[.,!#%{}()@])+)$', '/by_tag/påske/øyfjell.jpg')
>>> print m.groupdict()
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groupdict'

Øæåなどの一般的なUnicode文字を一致させるにはどうすればよいですか?上記のタググループとファイル名のグループの両方で、これらの文字にも一致できるようにしたいと思います。

26
Weholt

re.UNICODEフラグを指定する必要がありますおよびu接頭辞を使用して、文字列をUnicode文字列として入力します。

>>> re.match(r'^/by_tag/(?P<tag>\w+)/(?P<filename>(\w|[.,!#%{}()@])+)$', u'/by_tag/påske/øyfjell.jpg', re.UNICODE).groupdict()
{'tag': u'p\xe5ske', 'filename': u'\xf8yfjell.jpg'}

Python 2; in Python 3では、すべての文字列がUnicodeであるため、uを省略する必要があります。

45
Thomas

[〜#〜] unicode [〜#〜] フラグが必要です:

m = re.match(r'^/by_tag/(?P<tag>\w+)/(?P<filename>(\w|[.,!#%{}()@])+)$', '/by_tag/påske/øyfjell.jpg', re.UNICODE)
11

Python 2では、 re.UNICODE フラグと nicode 文字列コンストラクタが必要です

>>> re.sub(r"[\w]+","___",unicode(",./hello-=+","utf-8"),flags=re.UNICODE)
u',./___-=+'
>>> re.sub(r"[\w]+","___",unicode(",./cześć-=+","utf-8"),flags=re.UNICODE)
u',./___-=+'
>>> re.sub(r"[\w]+","___",unicode(",./привет-=+","utf-8"),flags=re.UNICODE)
u',./___-=+'
>>> re.sub(r"[\w]+","___",unicode(",./你好-=+","utf-8"),flags=re.UNICODE)
u',./___-=+'
>>> re.sub(r"[\w]+","___",unicode(",./你好,世界-=+","utf-8"),flags=re.UNICODE)
u',./___\uff0c___-=+'
>>> print re.sub(r"[\w]+","___",unicode(",./你好,世界-=+","utf-8"),flags=re.UNICODE)
,./___,___-=+

(後者の場合、コンマは中国語コンマです。)