如何用Python re库匹配非花括号包裹或花括号内带引号的内容
正则实现方案
你可以直接使用如下正则表达式,两个分组分别对应你提出的两个匹配条件:
import re pattern = r'([^{}]+)|("(?:\\.|[^"\\])*")(?=[^{}]*})'
规则说明
- 第一个分组
([^{}]+):匹配所有不包含{、}的连续文本,对应「未被花括号包裹」的匹配条件 - 第二个分组
("(?:\\.|[^"\\])*")(?=[^{}]*}):- 前半部分
"(?:\\.|[^"\\])*"匹配标准双引号字符串,自动支持转义的引号内容 - 后半部分正向前瞻
(?=[^{}]*})保证当前匹配的引号字符串后续不会出现左花括号,直到遇到右花括号,也就是限定该字符串一定位于某对花括号内部,对应「花括号包裹内的带引号内容」的匹配条件
- 前半部分
测试验证
用你给出的示例字符串测试:
test_str = 'match-this "" {% not-this "match:this:" %} "also_this"' result = [m for t in re.findall(pattern, test_str) for m in t if m] print(result)
输出结果:
['match-this "" ', '"match:this:"', ' "also_this"']
完全匹配你标注的需要命中的内容。
替换操作示例
如果要做替换,可以通过re.sub的回调函数区分两个匹配条件做不同处理:
def replace_callback(match): if match.group(1): # 命中第一个条件:非花括号包裹内容,自定义替换逻辑 return f'[外部内容]{match.group(1)}[/外部内容]' elif match.group(2): # 命中第二个条件:花括号内的引号内容,自定义替换逻辑 return f'[内部引号内容]{match.group(2)}[/内部引号内容]' output = re.sub(pattern, replace_callback, test_str) print(output)
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

