在python中正则表达不同格式的日期[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

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

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

日期格式如下:

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

输入2

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

found2

1973

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

python regex date
1个回答
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"))

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

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

© www.soinside.com 2019 - 2024. All rights reserved.