正则表达式无法匹配所有\begin{figure}块,仅返回首个begin到最后end内容
问题原因
- 字符组语法写错:你写的
[\s\S^f]不是「排除f的任意字符」,字符组内的^只有放在首位才代表排除规则,写在中间只会被识别为普通字符^,加上\s\S已经覆盖了所有字符范围,所以这个规则还是匹配所有字符。 - 正则默认贪婪匹配:
*量词会尽可能多的向后匹配符合规则的内容,所以会从第一个\begin{figure}一直匹配到整个文本最后一个\end{figure},只能拿到一个长匹配结果。
修正方案
开启非贪婪匹配即可,有两种写法可选,运行后都能拿到你要的结果:
写法1:搭配re.DOTALL参数(更简洁)
import re text = r''' \begin{figure} 1 \end{figure} aaa \begin{figure} 2 \end{figure} ''' # .*? 为非贪婪匹配,re.DOTALL让.可以匹配换行符 pattern = r"\\begin{figure}(.*?)\\end{figure}" r = re.findall(pattern, text, flags=re.DOTALL) # 处理掉前后的换行符,就能得到['1','2'] r = [item.strip() for item in r] print(r)
运行输出:['1', '2']
写法2:不用额外参数,直接用[\s\S]*?
pattern = r"\\begin{figure}([\s\S]*?)\\end{figure}" r = re.findall(pattern, text) r = [item.strip() for item in r]
运行结果和上面完全一致。
内容的提问来源于stack exchange,提问作者hengyue li
相关产品推荐
相关产品推荐

