Python正则表达式,跨多行匹配模式.. 为什么不工作?

17 投票
2 回答
28439 浏览
提问于 2025-04-16 03:05

我知道在解析文本时,最好是把所有的空格和换行符都去掉。不过我现在只是想快速解决我正在尝试的一个问题,但我搞不明白为什么它不管用。我在文档的不同地方用像“####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.Sre.DOTALL. 也能匹配换行符。

来源

http://docs.python.org/

20

试试这个代码:re.findall(r"####(.*?)\s(.*?)\s####", string, re.DOTALL)(当然,使用re.compile也可以)。

这个正则表达式会返回一个包含章节编号和章节内容的元组。

根据你的例子,它会返回[('1', 'ttteest'), ('2', ' \n\nttest')]

(顺便说一下:你的例子是无法运行的,对于多行字符串,使用'''"""

撰写回答