Python正则提取混合时间列表中24小时制HH:MM:SS时间返回空问题
问题根源
你的代码匹配失败是三个核心错误导致的:
- 正则表达式首尾多了JS语法专属的
/定界符,Python的re模块不需要这个标识,加了之后正则会把/当成需要匹配的实际字符,所有输入都不可能命中规则 - 你套用的正则是专门匹配纯24小时制HH:MM格式字符串的,要求整个字符串从开头到结尾只能是小时冒号分钟的结构,完全匹配不了你列表里带
pm标识、带空格、甚至带其他后缀字符的12小时制时间 - 没有处理无冒号的时间场景(比如列表里的
4pm. 1),也没有给解析器开启模糊匹配,无关字符会直接导致解析失败
修复后可运行代码
import re from dateutil import parser time_list = ['7:30 pm', '8:00 pm', '4:00 pm', '4pm. 1', '2 hour', '5 minutes', '1 hour', '30 minutes', 'one hour'] times_form = [] # 匹配12小时制带am/pm的时间,兼容带/不带冒号、前后有其他字符的场景 time_regex = re.compile(r'\b([01]?\d)(?::([0-5]\d))?\s*([ap]m)\b', re.IGNORECASE) for t in time_list: if time_regex.search(t): # fuzzy=True自动忽略时间前后的无关字符,比如'4pm. 1'里的.1 dt = parser.parse(t, fuzzy=True) # 补零格式化,保证输出符合HH:MM:SS的两位分段要求 times_form.append(f"{dt.hour:02d}:{dt.minute:02d}:{dt.second:02d}") print(times_form)
运行后输出正好是预期结果:['19:30:00', '20:00:00', '16:00:00']
关键修改点说明
- 删除了正则首尾多余的
/定界符,适配Python正则语法 - 重写正则规则,专门匹配带am/pm标识的12小时制时间,兼容
7:30 pm、4pm两种常见写法 - 给
parser.parse加了fuzzy=True参数,自动过滤时间字符串里夹杂的无关标点、数字,不会因为多余内容报错 - 格式化输出时用
02d自动补前导零,保证小时、分钟、秒段都是两位,符合标准24小时制时间格式
内容的提问来源于stack exchange,提问作者imhans4305
相关产品推荐
相关产品推荐

