Python提取文本中am/pm前数字的代码问题排查与修正
需求与问题描述
- 提取规则:仅提取文本中
am/pm标识前紧邻的数字,无pm时仅提取am前的数字 - 异常表现:测试输入
["who done this on 23 october to 26th october from 2 am to 10am"]时,现有代码输出为[23, 2],错误提取了日期中的数字23,漏提取了10am前的数字10,不符合预期输出[2, 10]
原有错误代码如下:
para = ["who done this on 23 october to 26th october from 2 am to 10am"] def time_ext(para): vals = [] samp_str = '' for i in t: if i.isnumeric() == True: samp_str = samp_str+i else: if samp_str == '': pass else: vals.append(samp_str) samp_str = '' if len(vals) > 0: vals = [int(i) for i in vals] else: pass return vals print(time_ext(para))
错误原因
- 基础语法错误:循环遍历用的变量
t未定义 - 核心逻辑缺失:原有逻辑会提取所有独立数字,完全没有校验数字后方是否为
am/pm标识,因此日期类无关数字会被误提取 - 场景兼容不足:没有处理数字与标识直接拼接的情况,遇到
10am这类写法时,数字和标识会被识别为连续字符串,无法拆分提取
修正方案
使用正则匹配可以精准命中符合规则的数字,逻辑简洁兼容性好,修正后代码如下:
import re def time_ext(para_list): result = [] for text in para_list: # 匹配规则:捕获连续数字 + 任意个空白字符 + am/pm(不区分大小写) time_nums = re.findall(r'(\d+)\s*(?i:am|pm)', text) # 不需要匹配pm时,把上一行正则替换为 r'(\d+)\s*(?i:am)' 即可 result.extend([int(num) for num in time_nums]) return result # 测试运行 para = ["who done this on 23 october to 26th october from 2 am to 10am"] print(time_ext(para)) # 运行输出:[2, 10],符合预期
匹配规则说明
(\d+):捕获1位及以上的连续数字,也就是需要提取的时间数值\s*:匹配数字和am/pm之间0到多个空白字符,同时兼容2 am(带空格)、10am(不带空格)两种常见写法(?i:am|pm):不区分大小写匹配am或pm标识,确保只有标识前的数字会被捕获,日期等其他位置的无关数字不会被误提取
内容的提问来源于stack exchange,提问作者Raghul
相关产品推荐
相关产品推荐

