使用Python正则表达式提取日期遇异常:匹配结果为None或仅返回分隔符
我来帮你拆解下问题出在哪,以及怎么解决~
问题分析
第一个代码返回None的原因
你的第一个正则表达式是:
date=re.match('(\d{4})[/.-](\d{2})[/.-](\d{2})$', date[0])
这里的$是匹配字符串结尾的锚点,但你的目标文本是'2025-03-21T12:54:41Z',日期后面还跟着T12:54:41Z,所以整个正则无法匹配到完整的字符串,自然返回None。另外注意变量名冲突——你把匹配结果存在date里,又用date[0]指代原文本,这会导致报错,建议把原文本存在其他变量(比如text)里。
第二个代码只输出'-'的原因
第二个正则用了命名捕获组(?P<sep>[-/]),而re.findall()默认会返回捕获组的内容,而不是整个匹配的字符串。所以你得到的是分隔符'-',而不是完整的日期字符串。
解决方案
方案1:修正正则表达式
针对第一个代码的修正
去掉结尾的$,或者用正则匹配到日期部分即可,同时注意变量名和原始字符串前缀r(避免转义问题):
import re text = '2025-03-21T12:54:41Z' date_match = re.match(r'(\d{4})[-/.](\d{2})[-/.](\d{2})', text) if date_match: print(date_match.group()) # 输出完整日期:2025-03-21 print(date_match.groups()) # 输出年、月、日元组:('2025', '03', '21')
针对第二个代码的修正
如果想用命名捕获组同时获取完整日期,可以用finditer()获取匹配对象,或者调整正则让findall()返回完整匹配:
# 方法1:用finditer获取匹配对象 date_reg_exp = re.compile(r'(\d{4}(?P<sep>[-/])\d{2}(?P=sep)\d{2})') matches = date_reg_exp.finditer(text) for match in matches: print(match.group(1)) # 输出完整日期:2025-03-21 # 方法2:去掉捕获组,直接匹配完整日期 date_reg_exp = re.compile(r'\d{4}[-/]\d{2}[-/]\d{2}') matches_list = date_reg_exp.findall(text) for match in matches_list: print(match) # 输出完整日期:2025-03-21
方案2:用datetime模块(更推荐)
你的文本是标准ISO格式,直接用Python内置的datetime模块处理更可靠,避免正则的各种边界问题:
from datetime import datetime text = '2025-03-21T12:54:41Z' # Python 3.11+支持直接解析带Z的格式,低版本可以替换Z为+00:00 dt = datetime.fromisoformat(text.replace('Z', '+00:00')) print(dt.date()) # 输出日期对象:2025-03-21 print(dt.strftime('%Y-%m-%d')) # 输出字符串格式的日期:2025-03-21
内容的提问来源于stack exchange,提问作者Ujjwal Pawar
相关产品推荐
相关产品推荐

