PythonとUnicodeによる正規表現


83

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

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

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

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

回答:


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などの文字クラスエイリアスにのみ影響します。このパターンでは何も使用されないため、使用されません。の影響を受けます。


15
うーん、プレフィックスurプレフィックスの両方を連結できることを知りませんでした。それはいいね!
Balthazar Rouberol 2013年

6
@BalthazarRouberol SyntaxError: invalid syntax Python 3.6で取得
Umair Ayub 2018

75

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と文字セットについて絶対に、積極的に知っておく必要があります(言い訳はありません!)


11
記事は素晴らしいです
ふわふわ

@nosklo、文字数を設定する中括弧({5})がUnicode文字で機能しないのはなぜですか、問題がありますが、+は正常に機能します。何か考えがありますか?ありがとう!
securecurve 2013

@securecurveわからない、そして魔法の水晶玉がなければ助ける方法はない。私はちょうどそれをテストしました、そしてそれは私にとってうまく働きます。それがうまくいかない場合は、新しい質問をして、コードと得られる結果を提供することを勧めします。
nosklo 2013

4
rePythonで使用する場合は、Unicode文字プロパティ(など\p{L})をサポートしていないことを知っておく必要があります。pypi.python.org/pypi/regexそうします。
騒々しい

re.UNICODEそれが唯一の速記文字クラスに影響するためのフラグは、ここでは役に立ちません\w\d\s
nhahtdh 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.