1. ホーム
  2. python

Python regex の部分式で、グローバルではなく、改行を含むすべての文字にマッチします。

2023-09-10 07:39:33

質問

私は re.MULTILINE ではない re.DOTALL というように、quot; any character" のワイルドカードと通常の . というワイルドカードの両方を含む正規表現を作成できます。

これを行う方法はありますか?改行を含めたいこれらのインスタンスで任意の文字に一致させるには、何を使用すればよいですか?

どのように解決するのですか?

改行や、quot;任意のシンボル(quot;)にマッチするように re.S / re.DOTALL のいずれかを使用することができます。

  1. (?s:.) - その インラインモディファイアグループ s フラグをオンにすると、すべての . パターンが改行文字を含むすべての文字にマッチするようにします。

  2. 以下のいずれかの回避策をとる。

[\s\S]
[\w\W]
[\d\D]

主な考え方は、文字クラスの中の反対の速記クラスは、入力文字列の中にあるどんな記号にもマッチするということです。

と比較すると (.|\s) などと比較すると、文字クラスによる解決はバックトラックが少ないため、より効率的です。 * または + の量詞)。小さな例を比較してみましょう。 (?:.|\n)+ 45ステップで完了するのに対して [\s\S]+ はわずか2ステップです。

をご覧ください。 Pythonのデモ で始まる行をマッチングしているところです。 123 で始まり、最初に現れる 3 まで、そしてその行の残りを含む。

import re
text = """abc
123
def
356
more text..."""
print( re.findall(r"^123(?s:.*?)^3.*", text, re.M) )
# => ['123\ndef\n356']
print( re.findall(r"^123[\w\W]*?^3.*", text, re.M) )
# => ['123\ndef\n356']