2

多くのメタ文字を含む可能性のあるパターンを検索する必要があります。現在、長い正規表現を使用しています。

prodObjMatcher=re.compile(r"""^(?P<nodeName>[\w\/\:\[\]\<\>\@\$]+)""", re.S|re.M|re.I|re.X)

(私の実際のパターンは非常に長いので、助けが必要な関連部分を貼り付けただけです)

これは、1 回の再コンパイルでそのようなパターンの組み合わせを記述する必要がある場合に特に苦痛です。

パターンの長さを短くするためのpythonicな方法はありますか?

4

1 に答える 1

5

ほら、あなたのパターンは次のように縮小できます

r"""^(?P<nodeName>[]\w/:[<>@$]+).*?"""

^短縮形クラス 、 、-]およびを除いて、文字クラス内の単語以外の文字をエスケープする必要はないことに注意してください\\文字クラスでエスケープされていないもの ( を除く) を保持する方法があります。

  • ]文字クラスの開始時
  • -文字クラスの開始/終了時
  • ^- は、文字クラスの先頭にリテラル シンボルとして配置する場合にのみエスケープする必要があります。

文字クラスの外では、, \, [, (, ), , +,$をエスケープする必要があります。^*?.

/Python 正規表現パターンの特殊な正規表現メタ文字ではなく、エスケープする必要がないことに注意してください。

問題を回避するために、正規表現パターンを定義するときは生の文字列リテラルを使用してください (単語境界r'\b'や backspace の混乱など'\b')。

于 2016-08-11T13:25:15.373 に答える