【发布时间】:2018-05-19 06:55:56
【问题描述】:
我的任务是使用 Python 从文本文件中提取各种日期。
根据要求,必须从文本文件中正确提取以下日期格式:
- 2009 年 4 月 20 日; 09 年 4 月 20 日; 2009 年 4 月 20 日; 2009 年 4 月 3 日
- 2009 年 3 月 20 日; 2009 年 3 月 20 日; 2009 年 3 月 20 日; 2009年3月20日; 2009 年 3 月 20 日;
- 2009 年 3 月 20 日; 2009 年 3 月 20 日; 2009 年 3 月 20 日; 2009 年 3 月 20 日
- 2009 年 3 月 20 日; 2009 年 3 月 21 日; 2009 年 3 月 22 日
- 2009 年 2 月; 2009 年 9 月; 2010 年 10 月 (应解析为 02/01/2009、09/01/2009 等)
- 6/2008; 12/2009 (应解析为 06/01/2008 等)。
- 2009; 2010 (应解析为 01/01/2009 和 01/01/2010)
正则表达式助你一臂之力!
想出了以下表达式:
(((0?[1-9]|1[0-2])((\/)|(-)))?(((0?[1-9]|[1-2][0-9]|3[0-1])((\/)|(-))))((19[0-9][0-9])|(20[0-1]{1}[0-9])|([0-9][0-9]))|((19[0-9][0-9])|(20[0-1]{1}[0-9])))|((0[1-9])|(1[0-9])|(2[0-9])|(3[0-1]))?(\D)?(Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)((\s|\.|-)((19[0-9][0-9])|(20[0-9][0-9])))
我可以使用 Regex101 对所有用例进行调试。
但是,当我尝试使用下面的代码在 Pandas 数据帧上运行它时,在某些情况下找不到匹配项 - (“df”代表 Pandas 数据帧,其中每一行都包含带有日期的原始文本以上格式之一)
import re
pattern = '(((0?[1-9]|1[0-2])((\/)|(-)))?(((0?[1-9]|[1-2][0-9]|3[0-1])((\/)|(-))))((19[0-9][0-9])|(20[0-1]{1}[0-9])|([0-9][0-9]))|((19[0-9][0-9])|(20[0-1]{1}[0-9])))|((0[1-9])|(1[0-9])|(2[0-9])|(3[0-1]))?(\D)?(Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)((\s|\.|-)((19[0-9][0-9])|(20[0-9][0-9])))'
flags = re.IGNORECASE
m = df.str.extract(pattern, flags)
不匹配的情况包括:
- A1977 年 2 月:Symmes 医院\n
- “NV 消防员在工作时死亡 2007 年 9 月。多年前部署到圣马力诺和训练时是朋友。仍然困扰着 pt。没有参加他的葬礼。精神/宗教: \n
- 的 Cathy Bowers 是一名 50 岁的单身白人女性,她向 ANH 饮食失调部门提出关于低体重的评估和治疗建议。她分享说,她最近体重减轻了很多,并且由于呕吐/吞咽困难以及对特定食物质地的厌恶而难以满足她的卡路里需求。具体来说,自 2012 年 5 月以来,她已经减掉了 18 磅,从 128 磅(BMI = 19.5,正常范围)到 110.2 磅(BMI = 16.8,体重不足范围),身高 5\'8 “个子高。她已经闭经两个月了。她现在的体重是她自高中以来的最低值,当时她是一名模特,体重 98 磅(BMI = 14.9,体重不足范围)。当时她闭经,感到压力为了保住工作而变瘦,并且很可能符合坦率的神经性厌食症限制型标准。\n'
对于所有这些情况,我都能正确调试表达式并在 Reg101 上验证它们。
这让我觉得 Reg101 使用的 Python 解析器/版本与我正在使用的 Python 版本 (3) 之间可能存在不匹配 - 或者可能是我不知道的参数。
有人知道吗?
提前致谢!
【问题讨论】: