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

Python REGEX:替换括号内所有*为逗号的匹配问题

解决括号内星号替换问题

核心思路

别尝试用单一正则直接替换所有目标星号,先精准定位括号内的内容,再在这个局部范围内替换所有星号。Python的re.sub()支持传入回调函数,刚好适配这种“先匹配范围、再内部处理”的需求。

基础场景代码(无嵌套括号)

如果你的文档里都是非嵌套的小括号,用这段代码就能解决问题:

import re

raw_text = '("A2OR01"  *  "A2OR02"  *  "A2OR03")'

def swap_stars_in_parens(match):
    # 把匹配到的整个括号内容里的*全换成,
    return match.group(0).replace('*', ',')

processed_text = re.sub(r'\([^)]+\)', swap_stars_in_parens, raw_text)
print(processed_text)

执行后输出:

("A2OR01"  ,  "A2OR02"  ,  "A2OR03")

正则解释

  • \([^)]+\):精准匹配从(开始到第一个)结束的内容,[^)]表示匹配非)的任意字符,确保只锁定括号内部区域,不会跨括号匹配。
  • 回调函数负责在匹配到的括号内容里全局替换星号,保证所有符合要求的星号都被替换。

你之前的正则失效原因

你写的(.+ (*) .+)有两个关键问题:

  1. *是正则元字符,必须转义成\*才能匹配字面量星号,否则它表示“匹配前面元素0次或多次”,实际运行会抛出语法错误(大概率你实际写的时候漏了转义)。
  2. 即使转义后,.+是贪婪匹配模式,会尽可能匹配最长的内容,导致只会命中最后一个星号,自然只能替换一次。

进阶场景:处理嵌套括号

如果文档里存在嵌套括号(比如(foo*(bar*baz))),基础正则会失效,这时候可以用递归正则处理:

import re

nested_text = '(foo*(bar*baz))'

def swap_nested_stars(match):
    inner_content = match.group(1)
    # 递归处理内层嵌套的括号
    replaced_inner = re.sub(r'\(([^()]+|(?R))*\)', swap_nested_stars, inner_content)
    return f'({replaced_inner.replace("*", ",")})'

processed_nested = re.sub(r'\(([^()]+|(?R))*\)', swap_nested_stars, nested_text)
print(processed_nested)

执行后输出:

(foo,(bar,baz))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:40:40