如何移除包含特定正则格式内容的多余括号?
移除特定日期时间格式内容的多余括号
需求
移除仅包含year_-_month_-_day hour:minute am/pm格式内容的多余括号,最终只保留一层括号包裹该内容;非此格式的括号内容(如((44_-_44)))保持不变。
原代码问题
原正则仅匹配单一层括号包裹的目标日期时间内容,无法处理多层嵌套括号的情况(比如((2022_-_02_-_18 20:00 pm))或((((2022_-_02_-_18 20:00 pm))))),导致替换操作完全没生效。
修正代码
直接匹配前后任意数量的括号,捕获中间的目标日期时间内容,再替换为一层括号包裹该内容即可:
import re input_text = "hhhh ((44_-_44)) ggj ((2022_-_02_-_18 20:00 pm)) ((((2022_-_02_-_18 20:00 pm))) (2022_-_02_-_18 00:00 am)" # 匹配目标日期时间格式 dt_pattern = r"\d*_-_\d{2}_-_\d{2} \d{2}:\d{2}\s*[ap]m" # 匹配前后任意数量括号包裹的目标内容 full_pattern = r"\(*(" + dt_pattern + r")\)*" # 替换为单一层括号 input_text = re.sub(full_pattern, r"(\1)", input_text) print(repr(input_text))
运行结果
'hhhh ((44_-_44)) ggj (2022_-_02_-_18 20:00 pm) (2022_-_02_-_18 20:00 pm) (2022_-_02_-_18 00:00 am)'
说明
dt_pattern:简化后的正则,精准匹配year_-_month_-_day hour:minute am/pm格式。full_pattern:\(*匹配任意数量的前置左括号,\)*匹配任意数量的后置右括号,中间的括号捕获目标内容,确保只替换完全由该日期时间格式填充的括号组。- 替换逻辑
(\1)将捕获的日期时间内容用单一层括号包裹,直接移除多余的嵌套括号。
内容的提问来源于stack exchange,提问作者Matt095
相关产品推荐
相关产品推荐

