10

分音記号を組み合わせた UTF8 文字列があります。\w正規表現シーケンスと一致させたい。アクセントのある文字には一致しますが、分音記号を組み合わせたラテン文字には一致しません。

>>> re.match("a\w\w\wz", u"aoooz", re.UNICODE)
<_sre.SRE_Match object at 0xb7788f38>
>>> print u"ao\u00F3oz"
aoóoz
>>> re.match("a\w\w\wz", u"ao\u00F3oz", re.UNICODE)
<_sre.SRE_Match object at 0xb7788f38>
>>> re.match("a\w\w\wz", u"aoo\u0301oz", re.UNICODE)
>>> print u"aoo\u0301oz"
aóooz

(SO マークダウン プロセッサは、上記の発音区別記号の組み合わせに問題があるようですが、最後の行に ́ があります)

とにかく発音区別記号を組み合わせて一致させるものはあります\wか? このテキストはファイル名からのものであるため、テキストを正規化したくありません。また、「ファイル名のユニコード正規化」全体をまだ実行する必要もありません。これは Python 2.5 です。

4

2 に答える 2

7

pypi に新しい " regex " パッケージがあることに気付きました。(私の理解が正しければ、これはいつか stdlibreパッケージを置き換える新しいパッケージのテスト バージョンです)。

ユニコードに関しては、(とりわけ)より多くの可能性があるようです。たとえば\X、単一の書記素の照合に使用される をサポートしています (結合を使用するかどうかに関係なく)。また、Unicode プロパティ、ブロック、およびスクリプトでのマッチングもサポートしているため、\p{M}組み合わせマークの参照に使用できます。\X前述のは\P{M}\p{M}*(結合記号ではない文字の後に 0 個以上の結合記号が続く) と同等です。

これにより\X、多かれ少なかれ、.ではなく に相当するユニコードが作成されることに注意し\wてください。したがって、あなたの場合\w\p{M}*は必要なものです。

これは (今のところ) stdlib 以外のパッケージであり、どの程度準備が整っているかはわかりません (また、バイナリ ディストリビューションには含まれていません)。あなたの質問に対する最も簡単で「正しい」答えです。(それ以外の場合は、前の回答に対する私のコメントで説明したように、文字範囲を明示的に使用していると思います)。

Unicode 正規表現に関する情報が記載されたこのページも参照してください。これには、いくつかの有用な情報も含まれている可能性があります (正規表現パッケージに実装されているもののいくつかのドキュメントとして役立つ場合があります)。

于 2010-07-06T12:54:27.257 に答える
2

unicodedata.normalizeを使用して、結合発音区別符号を1つのUnicode文字に構成できます。

>>> import re
>>> from unicodedata import normalize
>>> re.match(u"a\w\w\wz", normalize("NFC", u"aoo\u0301oz"), re.UNICODE)
<_sre.SRE_Match object at 0x00BDCC60>

正規化したくないとおっしゃっていたのは知っていますが、文字列を正規化するだけで、ファイル名自体などを変更する必要がないため、このソリューションに問題はないと思います。 。

于 2010-06-29T15:41:38.923 に答える