web-dev-qa-db-ja.com

PythonおよびUnicodeを使用した正規表現

文字列 'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ'からいくつかのUnicodeシンボルを削除する必要があります

確かにここに存在することは知っています。私は試した:

re.sub('([\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+)', '', 'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ')

しかし、それは機能しません。文字列は変わりません。何が間違っていますか?

80
bsn

python 2.xまたは3.0を使用していますか?

2.xを使用している場合は、「u」を使用して、正規表現文字列をUnicodeエスケープ文字列にしてください。正規表現であるため、正規表現文字列を「r」で生の文字列にすることをお勧めします。また、パターン全体を括弧で囲むことは不要です。

re.sub(ur'[\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+', '', ...)

http://docs.python.org/tutorial/introduction.html#unicode-strings

編集:

また、Unicode正規表現にre.UNICODE/re.U /(?u)フラグを使用することをお勧めしますが、このパターンは\ wや\ bなどの文字クラスエイリアスにのみ影響します。影響を受ける。

105
ʞɔıu

nicode 文字列を使用します。 re.UNICODE フラグを使用します。

>>> myre = re.compile(ur'[\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+', 
                      re.UNICODE)
>>> myre
<_sre.SRE_Pattern object at 0xb20b378>
>>> mystr = u'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ'
>>> result = myre.sub('', mystr)
>>> len(mystr), len(result)
(38, 22)
>>> print result
بسم الله الرحمن الرحيم

記事を読むJoel Spolskyと呼ばれる すべてのソフトウェア開発者が絶対的かつ積極的にUnicodeと文字セットについて知っておくべき絶対的な最低限(言い訳なし!

66
nosklo