You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用正则替换无嵌套字符串中不匹配的括号?

解决方案:替换未匹配的左括号,忽略成对括号

这问题挺常见的——要区分成对和不成对的括号来替换,确实不能直接用简单的re.sub,给你两个可行的方案,分别适配不同场景:

方法一:正则表达式(适合简单单括号场景)

我们可以用正向否定预查来精准定位那些没有对应右括号的左括号,正则逻辑是:匹配左括号,但要求这个左括号后面不存在任何非右括号字符后跟着右括号(也就是找不到匹配的右括号)。

代码示例

import re

text = 'AWS certification ( AWS Solutions Architect'
text1 = 'AWS certification ( AWS Solutions Architect )'

# 替换不成对的左括号为'-'
processed_text = re.sub(r'\((?![^)]*\))', '-', text)
processed_text1 = re.sub(r'\((?![^)]*\))', '-', text1)

print(processed_text)   # 输出: AWS certification - AWS Solutions Architect
print(processed_text1)  # 输出: AWS certification ( AWS Solutions Architect )

正则逻辑解释

  • \(:匹配目标左括号
  • (?![^)]*\)):正向否定预查,翻译成人话就是「从当前位置往后,找不到一个右括号」。其中[^)]*匹配任意数量的非右括号字符,\)匹配右括号,组合起来就确保这个左括号没有对应的闭合右括号。

方法二:手动遍历统计括号平衡(适合复杂嵌套/多括号场景)

如果你的字符串存在嵌套括号(比如((test) example (unclosed),正则就不太好处理了,这时候可以手动遍历字符串,统计括号的平衡数,最后替换那些未被匹配的左括号。

代码示例

def replace_unmatched_left_bracket(input_str, replacement='-'):
    bracket_balance = 0
    # 第一步:统计最终未匹配的左括号数量
    for char in input_str:
        if char == '(':
            bracket_balance += 1
        elif char == ')':
            if bracket_balance > 0:
                bracket_balance -= 1
    
    # 第二步:倒序遍历,替换最后N个未匹配的左括号(N就是bracket_balance)
    result_list = list(input_str)
    replace_count = 0
    for i in reversed(range(len(result_list))):
        if replace_count >= bracket_balance:
            break
        if result_list[i] == '(':
            result_list[i] = replacement
            replace_count += 1
    
    return ''.join(result_list)

# 测试用例
text = 'AWS certification ( AWS Solutions Architect'
text1 = 'AWS certification ( AWS Solutions Architect )'
text2 = '((Hello world) test (another unclosed'

print(replace_unmatched_left_bracket(text))    # AWS certification - AWS Solutions Architect
print(replace_unmatched_left_bracket(text1))   # AWS certification ( AWS Solutions Architect )
print(replace_unmatched_left_bracket(text2))   # ((Hello world) test -another unclosed

方法逻辑解释

  1. 先遍历一次字符串,统计括号的平衡数:每遇到左括号加1,遇到右括号且当前有未匹配的左括号就减1,最终的平衡数就是未被匹配的左括号数量。
  2. 倒序遍历字符串,找到最后N个左括号(N等于平衡数),将它们替换成目标字符——这样能保证只替换那些确实没有被右括号匹配的左括号,适配嵌套场景。

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

火山引擎 最新活动