Python正则表达式,跨多行匹配模式.. 为什么不工作?
我知道在解析文本时,最好是把所有的空格和换行符都去掉。不过我现在只是想快速解决我正在尝试的一个问题,但我搞不明白为什么它不管用。我在文档的不同地方用像“####1”这样的标记包裹了一些文本,想根据这些标记来解析,但无论我怎么尝试都不行。我觉得我在使用多行匹配方面是对的……如果有建议的话,我会很感激。
这个代码根本没有返回任何结果:
string='
####1
ttteest
####1
ttttteeeestt
####2
ttest
####2'
import re
pattern = '.*?####(.*?)####'
returnmatch = re.compile(pattern, re.MULTILINE).findall(string)
return returnmatch
2 个回答
28
多行模式并不意味着 .
会匹配换行符,它的意思是 ^
和 $
只在行的开头和结尾起作用。
re.M
re.MULTILINE当你使用这个选项时,模式中的字符
^
会匹配字符串的开头和每一行的开头(也就是每个换行符后面紧接着的地方);而$
会匹配字符串的结尾和每一行的结尾(也就是每个换行符前面紧接着的地方)。默认情况下,^
只会匹配字符串的开头,$
只会匹配字符串的结尾,以及字符串末尾的换行符前面的位置。
re.S
或 re.DOTALL
让 .
也能匹配换行符。
来源
20
试试这个代码:re.findall(r"####(.*?)\s(.*?)\s####", string, re.DOTALL)
(当然,使用re.compile
也可以)。
这个正则表达式会返回一个包含章节编号和章节内容的元组。
根据你的例子,它会返回[('1', 'ttteest'), ('2', ' \n\nttest')]
。
(顺便说一下:你的例子是无法运行的,对于多行字符串,使用'''
或"""
)