You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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))
错误原因
  1. 基础语法错误:循环遍历用的变量t未定义
  2. 核心逻辑缺失:原有逻辑会提取所有独立数字,完全没有校验数字后方是否为am/pm标识,因此日期类无关数字会被误提取
  3. 场景兼容不足:没有处理数字与标识直接拼接的情况,遇到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 13:57:32