如何用Python正则表达式匹配identifier{ }内的目标内容?
解决正则匹配嵌套大括号的问题
你的问题出在目标内容里包含嵌套的{{var}}结构,普通非贪婪匹配会在遇到第一个}时就终止,无法匹配到identifier{}对应的外层闭合大括号。
正确的正则表达式
在Python中,可以利用递归正则处理嵌套大括号结构,精准提取identifier{}内部的完整内容:
import re content = "identifier{ {{var1}} rest of the content} outer content identifier{ {{var2}} another content} identifier{ content with no vars }" pattern = r'identifier\{((?:[^{}]|(\{(?:[^{}]|(?2))*\}))*)\}' result = [match[0] for match in re.findall(pattern, content)] print(result)
正则规则解释
identifier\{:匹配固定前缀identifier{((?:[^{}]|(\{(?:[^{}]|(?2))*\}))*):核心捕获组,用于提取目标内容[^{}]:匹配非大括号的任意字符(\{(?:[^{}]|(?2))*\}):递归匹配嵌套的大括号结构,(?2)表示引用第二个捕获组的规则,实现多层嵌套的匹配
\}:匹配identifier{}对应的外层闭合大括号
运行后会得到你期望的结果:
["{{var1}} rest of the content", "{{var2}} another content", "content with no vars"]
Python 3.10+ 简化写法
如果使用Python 3.10及以上版本,可使用命名捕获组的递归引用,写法更直观:
pattern = r'identifier\{(?P<content>(?:[^{}]|(?P<nested>\{(?:[^{}]|(?P=nested))*\}))*)\}' result = re.findall(pattern, content) # 提取捕获的content部分 result = [item[0] for item in result]
内容的提问来源于stack exchange,提问作者ntriisii
相关产品推荐
相关产品推荐

