多种日期格式的正则表达式
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])
【讨论】:
以上是关于多种日期格式的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章