Unicode プロパティに一致する Python 正規表現
-
11-09-2019 - |
質問
Perl およびその他の現在の正規表現エンジンは、正規表現でカテゴリなどの Unicode プロパティをサポートしています。例えば。Perlでは使用できます \p{Ll}
任意の小文字と一致するか、または p{Zs}
任意のスペース区切り文字。これは Python の 2.x ラインでも 3.x ラインでもサポートされていません (残念ですが)。同様の効果を得る良い戦略を知っている人はいますか?自家製のソリューションは大歓迎です。
他のヒント
の正規表現するモジュール(標準re
モジュールの代替)\p{}
構文でのUnicodeコードポイントのプロパティをサポートしています。
あなたが苦労し、各文字の上のUnicodeData使用することができます:
import unicodedata
def strip_accents(x):
return u''.join(c for c in unicodedata.normalize('NFD', x) if unicodedata.category(c) != 'Mn')
といえば、いくつかの時間前、私は小さなプログラムを書いたにちょうどそれを行うには - Unicodeの仕様から抽出され、値の範囲に\p{...}
として書かれたUnicodeのカテゴリを変換しますの(v.5.0.0)。唯一のカテゴリは(例:L
、Zs
)サポートされており、BMPに制限されています。私はここで誰かがそれが役に立つ(鬼車は本当に良いオプションだということが)見つけた場合に、それを掲示しています。
使用例:
>>> from unicode_hack import regex
>>> pattern = regex(r'^\\p{Lu}(\\p{L}|\\p{N}|_)*')
>>> print pattern.match(u'疂_1+2').group(0)
疂_1
>>>
ここでソースのです。 JavaScriptバージョンには、同じデータを使用して、もあります。
あなたは、UnicodeプロパティクラスはPythonの正規表現パーサによってサポートされていないことだね。
あなたが素敵なハックをやってみたかった場合、それは一般的に有用であろう。、あなたはたとえば、ように、そのようなクラストークン(\p{M}
または何でも)のための文字列をスキャンし、対応する文字セットに置き換えプリプロセッサを作成することができます、\p{M}
は[\u0300–\u036F\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]
になる、と\P{M}
は[^\u0300–\u036F\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]
なる。
人々はあなたに感謝します。 :)
\p{Ll}
は、Pythonの正規表現には相当していない間、\p{Zs}
は'(?u)\s'
でカバーする必要があることに注意してください。
(?u)
、ドキュメントは、言うように「\ dは、\ D、\ S、\ W、\ bの、\のB、W \作りと\は、Unicode文字特性データベースにS。」と\s
は、任意のスペーシング文字を意味します。