You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:12:02