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
等連字符)解釋爲單個字符。他們不是模式。因此[---]
與[-]
沒有區別。實際上,[---]
是從-
到-
(含)的字符範圍。
字符類內的圓括號也被解釋爲文字圓括號,而不是分組分隔符。所以[(---)]
等於[-()]
,字符類包括連字符和左右括號。
因此字符類[^(---)]+
匹配比連字號或括號以外的任何字符:
In [23]: re.search('[^(---)]+', 'foo - bar').group()
Out[23]: 'foo '
In [24]: re.search('[^(---)]+', 'foo (bar').group()
Out[24]: 'foo '
你可以看到這是怎麼回事,爲什麼它不適合您的問題的工作。
感謝您的幫助。這個解釋很有幫助,更不用說它完美了。 – Battleroid