pat = re.compile(r'(?ms)^---(.*)\Z')
は、フラグとフラグ(?ms)
を追加します。MULTILINE
DOTALL
MULTILINE
フラグは(^
文字列の先頭だけでなく) 行の先頭と一致させます。これ---
が必要なのは、行の先頭で発生するが、必ずしも文字列の先頭であるとは限らないためです。
DOTALL
フラグは、.
改行を含む任意の文字と一致させます。(.*)
これは、複数の行に一致させるために必要です。
\Z
文字列の末尾 (行の末尾ではなく) に一致します。
例えば、
import re
text = '''\
Anything above this first set of hyphens should not be captured.
---
This is content. It should be captured.
Any sets of three hyphens beyond this point should be ignored.
'''
pat = re.compile(r'(?ms)^---(.*)\Z')
print(re.search(pat, text).group(1))
版画
This is content. It should be captured.
Any sets of three hyphens beyond this point should be ignored.
角かっこで正規表現文字クラスを定義すると、[...]
角かっこ内のものは (一般に、 のようなハイフンで囲まれた範囲を除いてa-z
) 単一の文字として解釈されることに注意してください。それらはパターンではありません。So[---]
は と変わらない[-]
。実際、は からまで[---]
の文字の範囲です。-
-
文字クラス内の括弧も、区切り文字をグループ化するのではなく、リテラルの括弧として解釈されます。Soは、ハイフンと左右の括弧を含む文字クラス[(---)]
と同等です。[-()]
したがって、文字クラス[^(---)]+
はハイフンまたは括弧以外の任意の文字に一致します。
In [23]: re.search('[^(---)]+', 'foo - bar').group()
Out[23]: 'foo '
In [24]: re.search('[^(---)]+', 'foo ( bar').group()
Out[24]: 'foo '
これがどこに向かっているのか、なぜそれが問題に対して機能しないのかがわかります。