Perlおよびその他の現在の正規表現エンジンは、正規表現でカテゴリなどのUnicodeプロパティをサポートしています。たとえば、Perlでは\p{Ll}
、任意の小文字に一致させるp{Zs}
ため、または任意のスペース区切り文字に使用できます。Pythonの2.x行でも3.x行でも、これはサポートされていません(残念ながら)。同様の効果を得るための良い戦略を知っている人はいますか?自家製のソリューションは大歓迎です。
6 に答える
正規表現モジュール(標準モジュールの代替re
)は、構文でUnicodeコードポイントプロパティをサポートし\p{}
ます。
鬼車正規表現エンジンへのPythonバインディングであるPonygurumaを試しましたか?そのエンジンでは、アルメニア文字と一致すると簡単に言うことができます。またはあまりにも働きます。\p{Armenian}
\p{Ll}
\p{Zs}
各文字でunicodedataを入念に使用できます。
import unicodedata
def strip_accents(x):
return u''.join(c for c in unicodedata.normalize('NFD', x) if unicodedata.category(c) != 'Mn')
自家製のソリューションと言えば、少し前に私はそれを行うための小さなプログラムを書きました-ユニコード仕様(v.5.0.0)\p{...}
から抽出された値の範囲に記述されたユニコードカテゴリを変換します。カテゴリのみがサポートされており(例:、)、BMPに制限されています。誰かがそれを役に立つと思う場合に備えて、私はここにそれを投稿しています(鬼車は本当により良いオプションのようですが)。L
Zs
使用例:
>>> 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)
\ w、\ W、\ b、\ B、\ d、\ D、\ s、および\SをUnicode文字プロパティデータベースに依存させます。」と\s
は任意の間隔文字を意味します。