为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

九州编程 2021-08-24 17:02:39
我正在尝试编写一个正则表达式,它将捕获以下时间格式: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}但理想情况下,我想要一个表达式,但是我所有的尝试都导致了与本文开头的正则表达式相似的结果。
查看完整描述

3 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

您可以使用此正则表达式:

\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]将期望ap

    • \.?将匹配文字.?使其成为可选的。请注意,.在正则表达式中匹配任何内容,并且要匹配实际 dot .,您必须执行\.

    • m 会期待一个 m

    • \.? 再次将匹配一个可选的 .

为了不区分大小写,您可以使用IGNORECASE标志编译此正则表达式:

import re
r = re.compile(r'\d{1,2}:\d{2}(\s*[ap]\.?m\.?)?', re.IGNORECASE)


查看完整回答
反对 回复 2021-08-24
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

我知道你特别要求使用正则表达式,但如果我没有指出dateutil解析器是在考虑某种事情的情况下编写的,那我就失职了。(当然取决于你的最终目标)


它在获取奇怪的日期/时间/日期时间字符串并将它们转换为日期时间对象方面做得非常好。


from dateutil.parser import parse


times = [ "1:00PM", "1:00pm", "1pm",  "1PM", "1:00 PM", "1:00 AM", "1:00pm", "2:00"]


for t in times:

    x = parse(t)

    print(f"{x} <--> {t}")

输出:


2018-11-21 13:00:00 <--> 1:00PM

2018-11-21 13:00:00 <--> 1:00pm

2018-11-21 13:00:00 <--> 1pm

2018-11-21 13:00:00 <--> 1PM

2018-11-21 13:00:00 <--> 1:00 PM

2018-11-21 01:00:00 <--> 1:00 AM

2018-11-21 13:00:00 <--> 1:00pm

2018-11-21 02:00:00 <--> 2:00


查看完整回答
反对 回复 2021-08-24
  • 3 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号