87

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

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

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

しかし、それは機能しません。文字列は同じままです。私は何が間違っているのですか?

4

2 に答える 2

110

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 などの文字クラス エイリアスにのみ影響します。影響を受ける。

于 2008-12-26T14:57:57.850 に答える
76

Unicode文字列を使用します。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 と文字セットについて知っておく必要がある絶対的な最小値 (言い訳はありません!)」

于 2008-12-26T15:55:11.650 に答える