Python正则表达式:忽略指定匹配项替换日期信息失败求助
问题解决:保留指定位置日期,删除其余日期
需求说明
需要忽略输入文本中第1个和第3个匹配到的日期,删除其余所有日期内容(仅保留时间部分),原正则代码无法实现预期效果。
输入文本
Input = ''' Captured on: 08-29-2023 09:43:26 Start Time: 08-28-2023 11:11:57 1St Cycle Time: 08-28-2023 11:12:06 Channel-00 Cycles Completed: 4404 Channel-00 Triggered Time: 08-29-2023 00:45:08 Channel-01 Cycles Completed: 24 Channel-01 Triggered Time: 08-28-2023 11:15:57'''
原代码问题
原代码stra = re.sub("^(?!Captured.*$).*?(\d+-\d+-2023 )", "", Input)存在两个核心问题:
- 仅排除了
Captured开头的行,未考虑需要保留第3个日期所在的1St Cycle Time行 - 正则逻辑仅针对行首非
Captured的内容处理,无法精准区分匹配项的位置,导致保留/删除规则失效
解决方案
使用re.sub的回调函数,通过计数判断当前匹配的是第几个日期,仅保留第1和第3个,其余删除日期部分:
import re Input = ''' Captured on: 08-29-2023 09:43:26 Start Time: 08-28-2023 11:11:57 1St Cycle Time: 08-28-2023 11:12:06 Channel-00 Cycles Completed: 4404 Channel-00 Triggered Time: 08-29-2023 00:45:08 Channel-01 Cycles Completed: 24 Channel-01 Triggered Time: 08-28-2023 11:15:57''' count = 0 def replace_date(match): global count count += 1 # 保留第1和第3个日期,其余仅保留前缀和时间 if count in (1, 3): return match.group(0) else: return match.group(1) + match.group(3) # 正则拆分内容:(前缀文本)(日期部分)(时间部分) pattern = re.compile(r'(.*?)(\d+-\d+-2023 )(\d{2}:\d{2}:\d{2})') result = pattern.sub(replace_date, Input) print(result)
代码说明
- 正则表达式
r'(.*?)(\d+-\d+-2023 )(\d{2}:\d{2}:\d{2})'将每行含日期的内容拆分为三部分:- 第1组:日期前的前缀文本(如
Start Time:) - 第2组:需要判断是否删除的日期部分(如
08-28-2023) - 第3组:需要保留的时间部分(如
11:11:57)
- 第1组:日期前的前缀文本(如
- 回调函数
replace_date通过全局计数器count定位匹配项:- 若为第1或第3个匹配项,直接返回完整内容(保留日期)
- 其余情况返回前缀+时间(删除日期)
运行结果
Captured on: 08-29-2023 09:43:26 Start Time: 11:11:57 1St Cycle Time: 08-28-2023 11:12:06 Channel-00 Cycles Completed: 4404 Channel-00 Triggered Time: 00:45:08 Channel-01 Cycles Completed: 24 Channel-01 Triggered Time: 11:15:57
内容的提问来源于stack exchange,提问作者OO7
相关产品推荐
相关产品推荐

