pat = re.compile(r'(?ms)^---(.*)\Z')
は、フラグとフラグ(?ms)を追加します。MULTILINEDOTALL
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 '
これがどこに向かっているのか、なぜそれが問題に対して機能しないのかがわかります。