我有一项任务是使用Python从文本文件中提取各种日期。
根据要求,必须从文本文件中正确提取以下日期格式:
正规救援!
得出以下表达式:
(((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)
没有匹配的情况包括:
对于所有这些情况,我能够正确调试表达式并在Reg101上验证它们。
这让我觉得Reg101使用的Python解析器/版本与我正在使用的Python版本(3)之间可能存在不匹配 - 或者可能是我不知道的参数。
任何人都有线索?
提前致谢!
答案 0 :(得分:2)
\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+)|\d{4}
2009年4月20日;零九年四月二十零日; 09年4月20日; 2009年3月3日至2009年3月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月(将解析为2009年1月2日, 09/01/2009等)6/2008; 12/2009(应解析为06/01/2008等)。 2009年; 2010年(将被解析为01/01/2009和01/01/2010)AFeb 1977: Symmes Hospital \ n NV消防员在工作时于2007年9月去世。是 从部署到圣马力诺的朋友和多年前的培训。 pt仍然令人不安。没去参加他的葬礼。精神/宗教: 凯茜鲍尔斯是一个50岁的单身白人女性,她出席了 ANH饮食失调部门进行评估和治疗 建议减肥。她分享她最近输了 体重很大,很难满足她的卡路里 需要因为呕吐/吞咽困难以及厌恶 特定的食物纹理。具体来说,自2012年5月以来,她已经失去了18岁 lbs,从128磅(BMI = 19.5,正常范围)到110.2磅(BMI = 16.8,体重不足)身高5英尺8英寸。她已经闭经了2个月。她目前的体重是她自高以来的最低体重 学校,当她是一个模特,体重98磅(体重指数= 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+)
匹配一个或多个数字后跟空格的可能性,后跟月份名称(或简短形式),然后是点.
或逗号{{1}的可能性},后跟,
个数字-
个数字; 或空格-
位数,可能有
,th
,rd
或st
以及后续逗号的可能性,然后是一个空格和更多的数字; 或空格后跟数字nd
匹配任意数字4次(这是一年,但可能会捕获其他有效数字,您可能需要根据自己的需要进行更改。添加单词边界为\d{4}
可能会很好第一步。