用于各种日期的 Python/Pandas 正则表达式 [重复]

Posted

技术标签:

【中文标题】用于各种日期的 Python/Pandas 正则表达式 [重复]【英文标题】:Python/Pandas Regex for a Wide Variety of Dates [duplicate] 【发布时间】: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) 之间可能存在不匹配 - 或者可能是我不知道的参数。

有人知道吗?

提前致谢!

【问题讨论】:

使用(?:0?[1-9]|[1-2][0-9]|3[0-1])/(?:0?[1-9]|1[0-2])/(?:19\d2|20[0-1][0-7]|\d2) 【参考方案1】:

代码

See regex in use here

\d+/\d+(?:/\d+)?|(?:\d+ )?(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)[.,]?(?:-\d+-\d+| \d+(?:th|rd|st|nd)?,? \d+| \d+)|\d4

结果

输入

2009 年 4 月 20 日; 09 年 4 月 20 日; 2009 年 4 月 20 日; 2009 年 3 月 20 日 4 月 3 日; 2009 年 3 月 20 日;行进 2009 年 2 月 20 日; 2009年3月20日; 2009 年 3 月 20 日; 2009 年 3 月 20 日; 2009 年 3 月 20 日; 20 2009年3月; 2009 年 3 月 20 日 2009 年 3 月 20 日; 2009 年 3 月 21 日; 3月22日, 2009 年 2 月 2009 年; 2009 年 9 月; 2010 年 10 月(应解析为 02/01/2009, 2009 年 9 月 1 日等)2008 年 6 月; 12/2009(应解析为 06/01/2008 等)。 2009; 2010 年(应解析为 01/01/2009 和 01/01/2010)1977 年 2 月: Symmes 医院\n NV 消防员于 2007 年 9 月在工作时死亡。曾是 多年前部署到圣马力诺和接受培训的朋友。 仍然困扰着pt。没有参加他的葬礼。精神/宗教: 的 Cathy Bowers 是一位 5​​0 岁的单身白人女性,她向 ANH 饮食失调部门进行评估和治疗 低体重的建议。她分享说她最近失去了 体重很大,难以满足她的卡路里 由于呕吐/吞咽困难和厌恶 特定的食物质地。具体来说,自 2012 年 5 月以来,她已经失去了 18 磅,从 128 磅(BMI = 19.5,正常范围)到 110.2 磅(BMI = 16.8,体重不足范围),身高 5 英尺 8 英寸。她已闭经 2 个月。她目前的体重是自高龄以来最低的 上学时,她是模特,体重 98 磅(BMI = 14.9, 减持范围)。当时,她有闭经,感到压力 为了保住工作而变瘦,并且很可能符合以下标准 坦率的神经性厌食症限制型。

输出

以下仅显示匹配项。

04/20/2009
04/20/09
4/20/09
4/3/09
Mar-20-2009
Mar 20, 2009
March 20, 2009
Mar. 20, 2009
Mar 20 2009
20 Mar 2009
20 March 2009
20 Mar. 2009
20 March, 2009
Mar 20th, 2009
Mar 21st, 2009
Mar 22nd, 2009
Feb 2009
Sep 2009
Oct 2010
02/01/2009
09/01/2009
6/2008
12/2009
06/01/2008
2009
2010
01/01/2009
01/01/2010
Feb 1977
Sep 2007
May 2012

说明

匹配以下任一选项 \d+/\d+(?:/\d+)? 匹配一位或多位数字,后跟 / 后跟一位或多位数字,然后是可能的另一个 / 与一位或多位数字 (?:\d+ )?(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)[.,]?(?:-\d+-\d+| \d+(?:th|rd|st|nd)?,? \d+| \d+) 匹配一个或多个数字的可能性,后跟一个空格,然后是月份名称(或其缩写形式),然后是点 . 或逗号 , 的可能性,后跟 - 数字- 位数; 空格 数字,可能有 thrdstnd,后面可能有逗号,然后是空格和更多数字; 空格后跟一个数字 \d4 匹配任意数字 4 次(这是单年,但可能会捕获其他有效数字,您可能需要根据需要进行更改。将单词边界添加为 \b\d4\b 可能是一个很好的第一步。

【讨论】:

以上是关于用于各种日期的 Python/Pandas 正则表达式 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何根据当前日期使用 python Pandas 从 Excel 工作表加载特定工作簿

日期时间范围之间的 Python Pandas 累积列

Python/pandas 导出到 excel 转换日期时间 (HH:mm)

Python pandas 转换(yy/mm)日期格式并选择特定时间范围

如何在 python Pandas 中执行/解决条件连接?

python pandas groupby分组后的数据怎么用