[英]Extracting time with regex from a string
我已经抓取了一些数据,并且有一些时间是 12 小时格式的。 字符串是这样的: Mon - Fri:,10:00 am - 7:00 pm
。 所以我需要提取10:00 am
和7:00 pm
的时间,然后将它们转换为 24 小时格式。 然后我要制作的最后一个字符串是这样的:
Mon - Fri:,10:00 - 19:00
在这方面的任何帮助将不胜感激。 我尝试了以下方法:
import re
txt = 'Mon - Fri:,10:00 am - 7:00 pm'
data = re.findall(r'\s(\d{2}\:\d{2}\s?(?:AM|PM|am|pm))', txt)
print(data)
但是这个正则表达式和我尝试使用的任何其他表达式都没有完成任务。
您的正则表达式在前导数字前强制使用空格,以防止,10:00 am
匹配,并且在冒号前需要两位数字,这与7:00 pm
不匹配。 r"(?i)(\d?\d:\d\d (?:a|p)m)"
似乎是最精确的选项。
之后,使用datetime.strptime
解析匹配并使用"%H:%M"
格式字符串将其转换为军事。 任何像10:67
这样的无效时间都会引发一个很好的错误(如果您预计应该忽略的字符串,请调整正则表达式以严格匹配24-hour times )。
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
您的正则表达式仅查找两位数小时( \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)
正则表达式需要像这里一样改变。
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 它只会匹配一个字符。
您可以在此处了解更多正则表达式。
在这里您可以在线尝试正则表达式。
为什么不使用时间模块?
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)
Output:
Mon - Fri:,10:00 - 19:00
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.