web-dev-qa-db-ja.com

Python Unicodeプロパティに一致する正規表現

Perlおよびその他の現在の正規表現エンジンは、正規表現でカテゴリなどのUnicodeプロパティをサポートしています。例えば。 Perlでは、\p{Ll}を使用して任意の小文字に一致させるか、p{Zs}を使用して任意のスペース区切り文字に一致させることができます。 Python(残念ながら)の2.x行と3.x行のどちらでも、これに対するサポートは見られません。同様の効果を得るための優れた戦略を知っている人はいますか?ソリューションは大歓迎です。

53
ThomasH

Ponyguruma 、a Python Oniguruma 正規表現エンジンへのバインド)を試しましたか?そのエンジンでは、単に\p{Armenian}と言うことができます。アルメニア文字と一致します。\p{Ll}または\p{Zs}も機能します。

23
joeforker

regex モジュール(標準のreモジュールの代替)は、\p{}構文でUnicodeコードポイントプロパティをサポートします。

57
ronnix

各文字でunicodedataを入念に使用できます。

import unicodedata

def strip_accents(x):
    return u''.join(c for c in unicodedata.normalize('NFD', x) if unicodedata.category(c) != 'Mn')
6
zellyn

自家製のソリューションと言えば、少し前に私は小さな プログラム を書きました-それを行うために-\p{...}として書かれたユニコードカテゴリをユニコードから抽出された値の範囲に変換します 仕様 (v.5.0.0)。カテゴリのみがサポートされ(例:LZs)、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バージョン もあります。

5
mgibsonbr

UnicodeプロパティクラスがPython regexパーサーでサポートされていないのは正しいです。

一般的に役立つニースハックを実行したい場合は、文字列をスキャンしてそのようなクラストークン(\p{M}など)を探し、それらを対応する文字セットに置き換えるプリプロセッサを作成できます。たとえば、\p{M}[\u0300–\u036F\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]になり、\P{M}[^\u0300–\u036F\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]になります。

人々はあなたに感謝するでしょう。 :)

4

_\p{Ll}_にはPython正規表現に相当するものはありませんが、_\p{Zs}_は'(?u)\s'でカバーする必要があります。_(?u)_は次のようになります。ドキュメントには、「\ w、\ W、\ b、\ B、\ d、\ D、\ s、および\ SをUnicode文字プロパティデータベースに依存させる」と記載されており、_\s_は任意の間隔文字を意味します。

2
tzot