在python

时间:2017-12-18 23:14:49

标签: 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; 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})')

我的正则表达式产生了这些结果:

INPUT1

Lab: B12 969 2007\n

招致:

12,969

输入2

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

found2

1973

问题

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

1 个答案:

答案 0 :(得分:2)

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

鉴于您正在使用带有编程语言的正则表达式,您可以使用代码生成正则表达式,因此您不会复制字符串。例如,请考虑这个快速,不完整和脏的代码段:

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"))

最后,我有几个正则表达式可以用来匹配两种日期格式。完成正则表达式是微不足道的,添加更多格式很容易。整个事情更容易阅读。当然,在连接正则表达式时你必须要小心(因为你可能会忘记括号之类的东西),但我认为这比处理模糊的正则表达式更容易。

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