多种日期格式的正则表达式

Posted

技术标签:

【中文标题】多种日期格式的正则表达式【英文标题】:Regex for multiple date formats 【发布时间】:2021-09-04 20:56:42 【问题描述】:

什么正则表达式可以匹配这种日期格式:2012 年 10 月 16 日?

我有一个看起来像这样的熊猫系列:

0             2012-05-25 00:00:00
1             2012-08-28 00:00:00
2             2012-08-22 00:00:00
3             2012-10-16 00:00:00
4    Oct, 16 , 2012/ Nov, 1, 2012
5             2012-05-20 00:00:00
6             2012-10-30 00:00:00
7             2012-11-12 00:00:00
8             2012-12-04 00:00:00
9            12/4/2012, 16/4/2012

我希望从第 4 行和第 9 行中提取不同的日期并将它们放在一个列表中。 我认为正则表达式是正确的方法,但我无法找到 2012 年 10 月 16 日所需的正则表达式。 有什么想法吗?

【问题讨论】:

.* 匹配该字符串。请在问题中添加您的尝试 - 如果您解释为什么使用正则表达式解析日期也会有所帮助,例如为什么 不会 您使用 dateutil.parse? 抱歉:“我希望从第 4 行和第 9 行中提取不同的日期并将它们放在一个列表中”不清楚,因为日期的格式不是Oct,16 , 2012 请编辑问题以删除x/y problem 并专注于您要解决的问题 - 不要忘记标题:)。 【参考方案1】:

通常不鼓励使用正则表达式解析日期。如果出于某种原因您确实需要该任务的正则表达式,请尝试以下操作:

[A-za-z]3,\d2,\s\d4

这匹配一个字符串:

[A-za-z]3 以三个字母(小写或大写)字符开头,后跟 ,一个逗号 \d2 正好是两位数 ,逗号 \s 一个空格字符(如发布的示例中所示)和 \d4 正好四位数

【讨论】:

谢谢!不是我真正想要的,我编辑了问题以澄清我的目的【参考方案2】:

不要使用正则表达式进行初始除法;你可以.split()字符串

一旦有了这些对,就可以使用正则表达式对其进行验证或尝试将它们解析为日期

value.split("/" if value.count("/") == 1 else ",")

示例使用

>>> value.split("/" if value.count("/") == 1 else ",")
['Oct, 16 , 2012', ' Nov, 1, 2012']
>>> value = "12/4/2012, 16/4/2012"
>>> value.split("/" if value.count("/") == 1 else ",")
['12/4/2012', ' 16/4/2012']

如果你有一个除数集合,你可以生成一个最合适的(否则raise StopIteration

next(x for x in (",", "/", "-") if value.count(x) == 1)

全部在一个总的 1 班轮中

df["B"] = df["A"].apply(lambda r: r.split(next(x for x in (" ", ",", "/", "-") if r.count(x) == 1))[0])

【讨论】:

以上是关于多种日期格式的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Java里面效验日期的正则表达式

日期时间格式正则表达式

给定正则表达式模式的示例日期时间格式

使用正则表达式匹配 yyyymmdd 中的日期格式

正则表达式验证 UTC 日期时间格式

正则表达式日期验证格式