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

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

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

慕神8447489 2022-11-29 17:03:52
我已经抓取了一些数据,并且有一些时间以 12 小时格式显示。字符串是这样的: Mon - Fri:,10:00 am - 7:00 pm. 所以我需要提取时间10:00 am,7:00 pm然后将它们转换为 24 小时格式。那么我最后要制作的字符串是这样的:Mon - Fri:,10:00 - 19:00在这方面的任何帮助将不胜感激。我尝试了以下方法:import retxt = '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)但是这个正则表达式和我尝试使用的任何其他正则表达式都没有完成任务。
查看完整描述

4 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

您的正则表达式在前导数字之前强制执行一个空格,这会阻止,10:00 am匹配,并且在无法匹配的冒号之前需要两个数字7:00 pmr"(?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


查看完整回答
反对 回复 2022-11-29
?
江户川乱折腾

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


查看完整回答
反对 回复 2022-11-29
?
函数式编程

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)


查看完整回答
反对 回复 2022-11-29
?
慕勒3428872

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/


查看完整回答
反对 回复 2022-11-29
  • 4 回答
  • 0 关注
  • 420 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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