3 回答

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]
将期望a
或p
。\.?
将匹配文字.
并?
使其成为可选的。请注意,.
在正则表达式中匹配任何内容,并且要匹配实际 dot.
,您必须执行\.
m
会期待一个m
\.?
再次将匹配一个可选的.
为了不区分大小写,您可以使用IGNORECASE
标志编译此正则表达式:
import re r = re.compile(r'\d{1,2}:\d{2}(\s*[ap]\.?m\.?)?', re.IGNORECASE)

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
添加回答
举报