正则表达式排除Loss Date,仅捕获目标日期的技术求助
解决正则提取日期时排除Loss Date的问题
问题原因
你用的(?!\s*Loss Date)是负前瞻断言,它的作用是检查当前匹配位置之后有没有指定内容,但你要排除的是前面带有Loss Date的日期,所以这个断言的位置和逻辑都不对,导致无法过滤掉Loss Date后的日期。
解决方案
方案1:用负回顾后发断言(推荐,支持PCRE/Python等引擎)
直接在日期正则前加负回顾后发,确保日期前面没有Loss Date(含后续空格/换行):
(?<!Loss Date[\s\n]*)((?:Date : )?(?:(?:[12][0-9]|0[1-9])[/.-]02|(?:30|[12][0-9]|0[1-9])[/.-](?:0[469]|11)|(?:3[01]|[12][0-9]|0[1-9])[/.-](?:0[13578]|1[02]))[/.-][0-9]{4})
(?<!Loss Date[\s\n]*):负回顾后发,确保当前日期的位置之前,没有Loss Date加上任意空格/换行- 捕获组里的内容是你原来的日期匹配规则,保留了可选的
Date :前缀
使用时,取第一个捕获到的结果即可。
方案2:代码层面过滤(兼容所有正则引擎)
如果你的正则环境不支持回顾后发,可以先匹配所有符合格式的日期,再过滤掉带有Loss Date前缀的项,取第一个有效日期:
以Python为例:
import re # 替换成你从PDF提取的文本内容 pdf_text = """ Date : 01/15/2024 Loss Date : 03/20/2024 """ # 匹配所有日期,同时捕获前面是否有Loss Date前缀 pattern = r'(Loss Date[\s\n]*)?((?:Date : )?(?:(?:[12][0-9]|0[1-9])[/.-]02|(?:30|[12][0-9]|0[1-9])[/.-](?:0[469]|11)|(?:3[01]|[12][0-9]|0[1-9])[/.-](?:0[13578]|1[02]))[/.-][0-9]{4})' all_matches = re.findall(pattern, pdf_text) # 过滤并取第一个有效日期 for prefix, date in all_matches: if not prefix: print("提取到的第一个日期:", date) break
额外提示
从PDF提取的文本可能存在换行、不规则空格,把正则里的\s*换成[\s\n]*可以更好适配这种情况。
内容的提问来源于stack exchange,提问作者mooregexleaner
相关产品推荐
相关产品推荐

