正则提取'%D %d, %Y'格式日期异常:仅获月份问题排查
问题分析与解决
你的代码存在两个关键错误:
正则表达式优先级问题:
你定义的word_months是多个月份用|分隔,直接拼接成word_date后,正则会被解析为January|February|...|November|December(\d+,\s\d{4})。由于|的优先级最低,这意味着表达式会匹配任意单个月份名,或者December加上后续的日年部分。所以处理November 1, 1960时,只会匹配到November这个单独的月份名。缺少月份与日年之间的空格匹配:
即使优先级问题解决,你的正则也没有匹配月份和1, 1960之间的空格,导致无法完整匹配目标字符串。
修正后的代码
import re from datetime import datetime # 用非捕获组(?:...)包裹月份,确保|的作用范围仅在月份内部 word_months = r'(?:January|February|March|April|May|June|July|August|September|October|November|December)' word_day_year = r'\d+,\s\d{4}' # 加上\s+匹配月份和日年之间的一个或多个空格,提升鲁棒性 word_date = rf'{word_months}\s+{word_day_year}' s = 'November 1, 1960 ( 1960-11-01 )' match_result = re.search(word_date, s) if match_result: print(match_result.group()) # 输出:November 1, 1960
额外优化建议
如果需要更严谨的日期匹配(比如限制日期为1-31),可以把word_day_year调整为(?:[1-9]|1\d|2\d|3[01]),\s\d{4},避免匹配无效的日期数字。
内容的提问来源于stack exchange,提问作者Yolo
相关产品推荐
相关产品推荐

