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

使用正则表达式实现右括号前后空格的条件化增删处理

括号空格的正则处理方案

问题背景

原代码用字符串替换处理括号前后空格,效果不符合预期:

import re

input_text = "((NOUN) )   ) de el auto rojizo, algo) ) )\n Luego ((PL_ADVB)dentro ((NOUN)de baúl ))abajo.) )."

input_text = input_text.replace(" )", ") ")

print(repr(input_text))

错误输出:

'((NOUN))   )  de el auto rojizo, algo)) ) \n Luego ((PL_ADVB)dentro ((NOUN)de baúl) )abajo.)) .'

需求说明

需要用re.sub实现两个规则:

  1. 移除右括号)前的所有空格
  2. 仅当)后不是点号.、换行符\n或行尾时,将)后的空格保留为单个;如果)后是.、\n或行尾,则移除)后的所有空格
    最终目标输出:
'((NOUN))) de el auto rojizo, algo)))
 Luego ((PL_ADVB)dentro ((NOUN)de baúl))abajo.)).'

解决方案代码

import re

input_text = "((NOUN) )   ) de el auto rojizo, algo) ) )\n Luego ((PL_ADVB)dentro ((NOUN)de baúl ))abajo.) )."

# 第一步:移除所有右括号前的空格
processed = re.sub(r'\s+\)', ')', input_text)
# 第二步:处理右括号后的空格
# 情况1:右括号后是.、\n或行尾,移除后面的所有空格
processed = re.sub(r')\s+(?=[.\n]|$)', ')', processed)
# 情况2:右括号后是其他字符,将后面的多个空格替换为单个空格
processed = re.sub(r')\s+(?![.\n]|$)', ') ', processed)

print(repr(processed))

代码解释

  1. 第一个正则r'\s+\)':匹配一个或多个空格紧跟右括号的模式,替换为单个右括号,彻底移除括号前的所有空格;
  2. 第二个正则r')\s+(?=[.\n]|$)':用正向断言匹配右括号后紧跟空格,且空格后是.、\n或行尾的情况,替换为单个右括号,移除这类空格;
  3. 第三个正则r')\s+(?![.\n]|$)':用负向断言匹配右括号后紧跟空格,且空格后不是.、\n或行尾的情况,替换为)加单个空格,确保只保留一个分隔空格。

运行这段代码就能得到符合要求的目标输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:45:34