使用正则表达式实现右括号前后空格的条件化增删处理
括号空格的正则处理方案
问题背景
原代码用字符串替换处理括号前后空格,效果不符合预期:
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实现两个规则:
- 移除右括号
)前的所有空格 - 仅当
)后不是点号.、换行符\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))
代码解释
- 第一个正则
r'\s+\)':匹配一个或多个空格紧跟右括号的模式,替换为单个右括号,彻底移除括号前的所有空格; - 第二个正则
r')\s+(?=[.\n]|$)':用正向断言匹配右括号后紧跟空格,且空格后是.、\n或行尾的情况,替换为单个右括号,移除这类空格; - 第三个正则
r')\s+(?![.\n]|$)':用负向断言匹配右括号后紧跟空格,且空格后不是.、\n或行尾的情况,替换为)加单个空格,确保只保留一个分隔空格。
运行这段代码就能得到符合要求的目标输出。
内容的提问来源于stack exchange,提问作者Matt095
相关产品推荐
相关产品推荐

