4 回答

TA贡献1891条经验 获得超3个赞
您的正则表达式在前导数字之前强制执行一个空格,这会阻止,10:00 am
匹配,并且在无法匹配的冒号之前需要两个数字7:00 pm
。r"(?i)(\d?\d:\d\d (?:a|p)m)"
似乎是最精确的选择。
之后,使用格式字符串datetime.strptime
解析匹配并将其转换为军事。任何无效的时间都会引发一个很好的错误(如果您预计应该忽略的字符串,请调整正则表达式以严格匹配24 小时时间)。"%H:%M"
10:67
import re
from datetime import datetime
def to_military_time(x):
return datetime.strptime(x.group(), "%I:%M %p").strftime("%H:%M")
txt = "Mon - Fri:,10:00 am - 7:00 pm"
data = re.sub(r"(?i)(\d?\d:\d\d (?:a|p)m)", to_military_time, txt)
print(data) # => Mon - Fri:,10:00 - 19:00

TA贡献1851条经验 获得超5个赞
为什么不使用时间模块?
import time
data = "Mon - Fri:,10:00 am - 7:00 pm"
parts = data.split(",")
days = parts[0]
hours = parts[1]
parts = hours.split("-")
t1 = time.strptime(parts[0].strip(), "%I:%M %p")
t2 = time.strptime(parts[1].strip(), "%I:%M %p")
result = days + "," + time.strftime("%H:%M", t1) + " - " + time.strftime("%H:%M", t2)
输出:
Mon - Fri:,10:00 - 19:00

TA贡献1807条经验 获得超9个赞
您的正则表达式只查找两位数小时 ( \d{2}
),前面有空格 ( \s
)。以下内容也捕获一位数字小时,可能用逗号代替空格。
data = re.findall(r'[\s,](\d{1,2}\:\d{2}\s?(?:AM|PM|am|pm))', txt)
但是,您可能希望将所有标点符号视为有效:
data = re.findall(r'[\s!"#$%&\'\(\)*+,-./:;\<=\>?@\[\\\]^_`\{|\}~](\d{1,2}\:\d{2}\s?(?:AM|PM|am|pm))', txt)

TA贡献1848条经验 获得超6个赞
正则表达式需要像这里一样改变。
import re
text = 'Mon - Fri:,10:00 am - 7:00 pm'
result = re.match(r'\D* - \D*:,([\d\s\w:]+) - ([\d\s\w:]+)', text)
print(result.group(1))
# it will print 10:00 am
print(result.group(2))
# it will print 7:00 pm
你需要像 '+' 和 '*' 这样的东西来告诉正则表达式得到多个单词,如果你只使用 \s 它只会匹配一个字符。
您可以在此处了解更多正则表达式。
https://regexr.com/
在这里您可以在线尝试正则表达式。
https://regex101.com/
添加回答
举报