如何用正则表达式分离含嵌套括号的括号内企业名称
处理嵌套括号的企业名称提取方案
嘿,这个问题我之前也踩过坑!普通正则没法处理嵌套括号的情况,得用支持平衡括号匹配的递归正则语法才行,下面给你具体的解决思路和代码:
核心思路
你的需求是提取被最外层括号包裹的企业名称,而企业名称内部可能有嵌套括号。关键是要匹配成对的平衡括号——也就是从最外层的(开始,找到对应的),中间的嵌套括号不会干扰匹配的终止位置。
可行的正则与代码实现
以Python为例,我们可以用支持递归的正则表达式来实现:
import re # 示例输入字符串 input_str1 = "(Motor (Sport) (racing) Ltd.) (Motorsport racing (Ltd.)) (Motorsport racing Ltd.)" input_str2 = "(Motor (Sport) (racing) Ltd.) (Motorsport racing (Ltd.))" # 匹配平衡括号对的正则表达式 # 解释: # \(: 匹配最外层左括号 # ([^()]+|(?R))*: 要么匹配非括号字符,要么递归匹配整个模式(处理嵌套括号) # \): 匹配最外层对应的右括号 pattern = re.compile(r'\(([^()]+|(?R))*\)') # 提取所有匹配项,并去掉首尾的括号 def extract_company_names(input_str): matches = pattern.finditer(input_str) return [match.group()[1:-1] for match in matches] # 测试第一个输入 result1 = extract_company_names(input_str1) for i, s in enumerate(result1, 1): print(f"str{i} = {s}") # 测试第二个输入 print("\n--- 第二个输入结果 ---") result2 = extract_company_names(input_str2) for i, s in enumerate(result2, 1): print(f"str{i} = {s}")
输出结果
运行代码后,第一个输入会输出:
str1 = Motor (Sport) (racing) Ltd. str2 = Motorsport racing (Ltd.) str3 = Motorsport racing Ltd.
第二个输入会输出:
--- 第二个输入结果 --- str1 = Motor (Sport) (racing) Ltd. str2 = Motorsport racing (Ltd.)
完全符合你的预期!
注意事项
- 如果你的Python版本低于3.10,原生的
re模块可能不支持递归语法(?R),这时候可以安装第三方库regex(pip install regex),用法和上面的代码完全一致,它对递归正则的支持更好。 - 这个正则会忽略括号外的任何内容,只提取所有平衡的括号对内容,适用于你给出的输入格式。
内容的提问来源于stack exchange,提问作者Eqr444
相关产品推荐
相关产品推荐

