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) 存在几个问题:
- 仅匹配大括号结构,未覆盖方括号的情况;
[^(/{name})]是字符集语法,只能排除单个字符,无法排除{name}这个完整字符串;.+是贪婪匹配,会导致匹配范围超出目标结构。
解决方案
使用支持匹配两种括号结构,且能正确跳过内部{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
相关产品推荐
相关产品推荐

