我知道,对于解析我理想情况下应该删除所有空格和换行符,但我只是这样做是为了快速修复我正在尝试的东西,我无法弄清楚为什么它不起作用..我已经包装了不同的区域我的文档中包含“#### 1”这样的包装器的文本,我正在尝试基于此进行解析,但无论我尝试什么,它都无法正常工作,我认为我正在使用多行...任何建议都表示赞赏
这根本不会返回任何结果:
string='
####1
ttteest
####1
ttttteeeestt
####2
ttest
####2'
import re
pattern = '.*?####(.*?)####'
returnmatch = re.compile(pattern, re.MULTILINE).findall(string)
return returnmatch
答案 0 :(得分:23)
多行并不意味着.
会匹配行返回,这意味着^
和$
仅限于行
re.M被 re.MULTILINE
当指定时,模式字符'^'匹配在字符串的开头和每行的开头(紧跟在每个换行符之后);并且模式字符'$'>在字符串的末尾和每行的末尾(紧接在每个>换行符之前)匹配。默认情况下,'^'仅匹配字符串的开头,'$'仅匹配字符串的>末尾,紧接在字符串末尾的换行符(如果有)之前。
re.S
或re.DOTALL
使.
与新行匹配。
<强>来源
答案 1 :(得分:14)
尝试re.findall(r"####(.*?)\s(.*?)\s####", string, re.DOTALL)
(当然也适用于re.compile
。)
此正则表达式将返回包含节的编号和节内容的元组。
对于您的示例,这将返回[('1', 'ttteest'), ('2', ' \n\nttest')]
。
(顺便说一句:您的示例不会投放,对于多行字符串,请使用'''
或"""
)