You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:47:54