如何使用RegEx移除内部内容仅为数字的成对括号()
括号内为纯数字时删除成对括号的实现方案
纯正则无法可靠处理嵌套括号的场景,更稳妥的实现方式是使用栈遍历字符串,实现逻辑如下:
- 遍历字符串的每一个字符,非右括号字符直接入栈
- 遇到右括号时,从栈顶依次弹出元素直到匹配到对应的左括号,提取出括号内的内容
- 校验提取的内容是否为纯数字:
- 是纯数字:直接将数字内容入栈,省略括号
- 不是纯数字:将括号和原内容拼接后重新入栈
- 遍历完成后将栈内字符拼接即为最终结果
代码实现
def remove_numeric_brackets(s): stack = [] for char in s: if char != ')': stack.append(char) continue # 提取括号内内容 content = [] while stack and stack[-1] != '(': content.append(stack.pop()) # 弹出匹配的左括号 if stack: stack.pop() content_str = ''.join(reversed(content)) if content_str.isnumeric(): stack.append(content_str) else: stack.append(f'({content_str})') return ''.join(stack) # 测试示例 input_str = '((1)+(1))+2+(1+2)+((2))' output = remove_numeric_brackets(input_str) print(output)
运行输出结果为:
(1+1)+2+(1+2)+2
如果你可以确认输入中没有嵌套括号,也可以用正则循环替换实现:
import re def remove_numeric_brackets_re(s): while True: new_s = re.sub(r'\((\d+)\)', r'\1', s) if new_s == s: break s = new_s return s
该方案需要多次循环替换,性能低于栈实现,且仅适用于无嵌套、括号内无多余非数字字符的场景。
内容的提问来源于stack exchange,提问作者Deera Wijesundara
相关产品推荐
相关产品推荐

