1

次の行を書いたプログラマーは、おそらく という python パッケージを使用していますregex

UNIT = regex.compile("(?:{A}(?:'{A})?)++|-+|\S".format(A='\p{Word_Break=ALetter}'))

A='\p{Word_Break=ALetter}'誰かが何を-+意味するかを説明するのを手伝ってもらえますか?

4

1 に答える 1

3

演算子は\p{property=value}Unicode コードポイント プロパティに一致し、リンク先のパッケージ インデックス ページに記載されています。

  • スクリプトとブロックを含む Unicode コードポイント プロパティ

    \p{property=value}; \P{property=value}; \p{value} ; \P{value}
    

エントリは、コードポイントが値を持つWord_Breakプロパティを持つ任意の Unicode 文字に一致しますALetter(現在、Unicode コードポイント データベースには 24941 個の一致があります。詳細については、Unicode テキストのセグメンテーション、単語境界の章の仕様を参照してください)。

あなたが示した例では、標準のpython文字列フォーマットも使用して、部分式をコンパイル中の正規表現に補間しています。.format(A='...')「{A}」の部分は、その部分を埋める単なるプレースホルダーです。最終結果は次のとおりです。

"(?:\p{Word_Break=ALetter}(?:'\p{Word_Break=ALetter})?)++|-+|\S"

シーケンスは、Python モジュールの式と同様に、-+1 つ以上のダッシュに一致するだけで、実際には特別なものではありません。-re

さて、その++ の方が面白いです。これは所有量指定子であり、これを使用すると、正規表現マッチャーがパターンのすべての可能な順列を試行するのを防ぎます。これはパフォーマンスの最適化であり、壊滅的なバックトラッキングの問題を防ぐものです。

于 2012-09-02T16:05:15.743 に答える