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

Python正则表达式匹配问题:提取含{name}的特定括号结构

解决Python正则提取特定括号结构的问题

需求分析

从文本 '[1 | Hi {name} | Hello {name} | Good morning {name}] other text {1|{name}| 3| 4} OTHER {5 |{name}| 6| 7}' 中提取三种结构:

  • 方括号包裹的内容:[1 | Hi {name} | Hello {name} | Good morning {name}]
  • 大括号包裹的内容:{1|{name}| 3| 4} 和 {5 |{name}| 6| 7}
    要求忽略内部的{name},不影响外层括号的匹配。

问题分析

你之前的正则 re.findall(r'\s*(\{[^(/{name})].+\})\s*', message) 存在几个问题:

  1. 仅匹配大括号结构,未覆盖方括号的情况;
  2. [^(/{name})] 是字符集语法,只能排除单个字符,无法排除{name}这个完整字符串;
  3. .+ 是贪婪匹配,会导致匹配范围超出目标结构。

解决方案

使用支持匹配两种括号结构,且能正确跳过内部{name}的正则表达式:

import re

message = '[1 | Hi {name} | Hello {name} | Good morning {name}] other text {1|{name}| 3| 4} OTHER {5 |{name}| 6| 7}'
pattern = r'\s*(\[.*?\]|\{(?:{name}|[^{}])*?\})\s*'
result = re.findall(pattern, message)

print(result)

正则解释

  • \s*:匹配前后可能存在的空白字符,避免提取的内容带多余空格;
  • \[.*?\]:匹配方括号包裹的内容,.*? 是非贪婪匹配,确保只匹配到第一个闭合的];
  • \{(?:{name}|[^{}])*?\}:匹配大括号包裹的内容:
    • (?:{name}|[^{}]):非捕获组,要么匹配完整的{name},要么匹配不包含{}的普通字符;
    • *?:非贪婪重复,确保匹配到外层的第一个闭合}。

运行结果

输出:

['[1 | Hi {name} | Hello {name} | Good morning {name}]', '{1|{name}| 3| 4}', '{5 |{name}| 6| 7}']

内容的提问来源于stack exchange,提问作者kirastel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:05:20