Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中不同日期格式的正则表达式_Python_Regex_Date - Fatal编程技术网

python中不同日期格式的正则表达式

python中不同日期格式的正则表达式,python,regex,date,Python,Regex,Date,我试图编写一个正则表达式来捕获不同格式的日期 这些句子是一个系列,系列的每个样本只包含一个日期,但可能有其他数字 日期的格式如下所示: 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;

我试图编写一个正则表达式来捕获不同格式的日期

这些句子是一个系列,系列的每个样本只包含一个日期,但可能有其他数字

日期的格式如下所示:

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
6/2008; 12/2009
2009; 2010
对于只有两位数的年份,我们假设它是20世纪的年份(即19nn)

这是我的正则表达式:

df_dates = df.str.extract(r'((?:\d{1,2})?[-/\s,]{0,2}(?:\d{1,2})?(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec|January|February|March|April|May|June|July|August|September|October|November|December)?[-/\s,]{0,2}(?:19|20)?\d{2})')
我的正则表达式生成以下结果:

输入1

Lab: B12 969 2007\n
12,969
found1

Lab: B12 969 2007\n
12,969
输入2

Contemplating jumping off building - 1973 - difficulty writing paper.\n
1973
found2

Contemplating jumping off building - 1973 - difficulty writing paper.\n
1973
问题


如何更改正则表达式以获得所需的结果?

我坚信,您应该尝试使用多个正则表达式来处理数据,而不是尝试使用单个正则表达式来完成所有操作。这样,您将有一个更加灵活的系统,因为添加新的日期格式将比试图编辑难以阅读的正则表达式更容易,从而使其更加模糊

假设您将正则表达式与编程语言一起使用,那么您可以使用代码生成正则表达式,这样就不会重复字符串。作为一个例子,考虑这个快速、不完整和脏代码片段:

import re

monthsShort="Jan|Feb"
monthsLong="January|February"
months="(" + monthsShort + "|" + monthsLong + ")"
separators = "[/-]"
days = "\d{2}"
years = "\d{4}"

regex1 = months + separators + days
regex2 = days + separators + months

print(re.search(regex1,"Jan/01"))
最后,我有几个正则表达式可以用来匹配两种日期格式。完成正则表达式很简单,添加更多格式也很容易。整个故事更容易阅读。当然,在连接正则表达式片段时必须小心(因为您可能会忘记括号之类的东西),但我认为这比处理晦涩的正则表达式更容易


编辑:我忘了提一件事:在生成正则表达式之后,您可以将它们添加到列表中,这样您就可以在单个循环中迭代它们并将它们应用到文本中。或者,如果你真的需要,你可以用所有的正则表达式生成一个正则表达式(通过使用括号和竖条),并用一个语句应用它们。

我不明白为什么“1973”不应该匹配。您的最后一个示例是“2010”,其格式与“1973”相同。不确定是否重复。这是一个关于正则表达式的问题,而另一个问题并不局限于正则表达式。话虽如此,我确实认为您链接的问题中的答案可能对本案例也很有用。谢谢您的帮助!我用你的方法解决了这个问题@燕佩,我很高兴这有帮助。请将答案标注为“最佳答案”。