使用正则表达式从字符串中提取时间

我已经抓取了一些数据,并且有一些时间以 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)

但是这个正则表达式和我尝试使用的任何其他正则表达式都没有完成任务。


慕神8447489
浏览 421回答 4
4回答

万千封印

您的正则表达式在前导数字之前强制执行一个空格,这会阻止,10:00 am匹配,并且在无法匹配的冒号之前需要两个数字7:00 pm。r"(?i)(\d?\d:\d\d (?:a|p)m)"似乎是最精确的选择。之后,使用格式字符串datetime.strptime解析匹配并将其转换为军事。任何无效的时间都会引发一个很好的错误(如果您预计应该忽略的字符串,请调整正则表达式以严格匹配24 小时时间)。"%H:%M" 10:67import refrom datetime import datetimedef 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

江户川乱折腾

为什么不使用时间模块?import timedata = "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

函数式编程

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

慕勒3428872

正则表达式需要像这里一样改变。import retext = '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 amprint(result.group(2))# it will print 7:00 pm你需要像 '+' 和 '*' 这样的东西来告诉正则表达式得到多个单词,如果你只使用 \s 它只会匹配一个字符。您可以在此处了解更多正则表达式。https://regexr.com/在这里您可以在线尝试正则表达式。https://regex101.com/
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python