Python 如何删除字符串中所有以proof{开头、以}结尾的子串
问题原因
你原来的正则写法存在三个核心问题,导致无法得到预期结果:
- 使用
re.search只会提取第一个匹配到的片段,无法批量替换所有目标proof块,也不会保留块外的其他正常内容 - 默认的
.*是贪婪匹配模式,会尽可能匹配最长的内容,直接跨多个proof块匹配到字符串最后一个},吞掉中间的正常文本 - 正则默认模式下
.无法匹配换行符,根本识别不了跨多行的proof块内容
正确实现代码
直接用re.sub做全局非贪婪替换,开启跨行匹配模式即可:
import re # 直接使用你已经定义好的原始字符串s即可 pattern = r'proof\{.*?\}' result = re.sub(pattern, '', s, flags=re.DOTALL) # 打印即可得到预期输出 print(result)
代码说明
- 正则里的
.*?是非贪婪匹配,遇到最近的一个}就会停止匹配,不会跨proof块吞掉无关内容;且你给出的proof块内部仅包含()、[]符号,不存在多余的},不会出现提前截断的问题 flags=re.DOTALL参数让.可以匹配包括换行符在内的所有字符,完美适配跨多行的proof内容块re.sub会自动扫描整个字符串,把所有匹配到的proof{...}块替换为空字符串,替换后原块位置的逗号会自动保留,和你给出的期望输出完全一致。
内容的提问来源于stack exchange,提问作者Martin Kunze
相关产品推荐
相关产品推荐

