编写正则表达式以捕获许多不同的日期格式

我正在尝试编写一个正则表达式,它将捕获以下时间格式:

H:MM
HH:MM

以及 PM 或 PM 的变化,在时间之后或在时间之后有一个空格,或在小写中,或用 AM 代替(希望你明白)。作为一些例子:

1:00PM, 1:00pm, 1pm, 1PM, 1:00 PM, 1:00pm, 2:00

这是我目前拥有的正则表达式:

([0-9]|0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9])?(( )?(PM|AM|am|pm|a.m|p.m|P.M|P.M|a.m.|p.m.|P.M.|A.M.))?

但是,在为我的所有格式工作时,它还会捕获所有其他整数,我不知道如何解决这个问题。

为了解决这个问题,我写了 2 个单独的,一个捕捉时间:

([0-9]|0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9])

一个只用 PM/AM 位捕获时间:

([0-9]|0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9])?(( )?(PM|AM|am|pm|a.m|p.m|P.M|P.M|a.m.|p.m.|P.M.|A.M.)){1,2}

但理想情况下,我想要一个表达式,但是我所有的尝试都导致了与本文开头的正则表达式相似的结果。


九州编程
浏览 165回答 3
3回答

慕的地8271018

您可以使用此正则表达式:\d{1,2}:\d{2}(\s*[ap]\.?m\.?)?说明:\d{1,2} 将匹配 1 或 2 位数字(小时)。:将匹配文字:。\d{2} 将匹配精确的 2 位数字(分钟)。(\s*[ap]\.?m\.?)?: 要么匹配要么\s*[ap]\.?m\.?不匹配,因为?后面的括号。现在,让我们分解\s*[ap]\.?m\.?一下:\s*将匹配零个或多个空格。\s对于空白,以及*零个或多个。[ap]将期望a或p。\.?将匹配文字.并?使其成为可选的。请注意,.在正则表达式中匹配任何内容,并且要匹配实际 dot .,您必须执行\.m 会期待一个 m\.? 再次将匹配一个可选的 .为了不区分大小写,您可以使用IGNORECASE标志编译此正则表达式:import re r = re.compile(r'\d{1,2}:\d{2}(\s*[ap]\.?m\.?)?', re.IGNORECASE)

幕布斯6054654

我知道你特别要求使用正则表达式,但如果我没有指出dateutil解析器是在考虑某种事情的情况下编写的,那我就失职了。(当然取决于你的最终目标)它在获取奇怪的日期/时间/日期时间字符串并将它们转换为日期时间对象方面做得非常好。from dateutil.parser import parsetimes = [ "1:00PM", "1:00pm", "1pm",&nbsp; "1PM", "1:00 PM", "1:00 AM", "1:00pm", "2:00"]for t in times:&nbsp; &nbsp; x = parse(t)&nbsp; &nbsp; print(f"{x} <--> {t}")输出:2018-11-21 13:00:00 <--> 1:00PM2018-11-21 13:00:00 <--> 1:00pm2018-11-21 13:00:00 <--> 1pm2018-11-21 13:00:00 <--> 1PM2018-11-21 13:00:00 <--> 1:00 PM2018-11-21 01:00:00 <--> 1:00 AM2018-11-21 13:00:00 <--> 1:00pm2018-11-21 02:00:00 <--> 2:00
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python