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

如何用Python正则表达式提取带格式的数字(如时间13:30)?

正则表达式解析与问题解决

正则表达式r'\d+(?::\d+)?'的含义

把这个表达式拆成两部分拆解:

  • \d+:匹配1个或多个连续数字,像8、13、30这类数字串都能被这部分命中。
  • (?::\d+)?:这是一个可选匹配项:
    • ::匹配冒号本身;
    • \d+:同样匹配1个或多个连续数字;
    • 整个(?::\d+)被?修饰,表示这一段(冒号+数字串)可以出现0次或者1次。

合起来,这个表达式的作用就是:匹配一串数字,这串数字后面可以选择性地跟着一个冒号加另一串数字。

能否匹配单独数字8?

完全可以。因为(?::\d+)?是可选的,当遇到单独的8时,表达式的\d+部分会直接匹配到它,后面的可选部分不生效,所以8会被成功提取。

针对需求的正确代码示例

用这个正则表达式就能得到你想要的[8, "13:30"]结果:

import re
text = "new notebook was sold  8 times before  13:30 in given shop"
result = re.findall(r'\d+(?::\d+)?', text)
# 若需要把单独数字转成整数,可做如下处理
processed_result = [int(item) if ':' not in item else item for item in result]
print(processed_result)  # 输出: [8, '13:30']

你之前尝试的正则的问题

  • 第一个正则[0-5][0-9]:只能匹配两位数字,且范围限定在00-59,会把13:30拆成13和30提取,同时漏掉单独的8。
  • 第二个正则\d+:会把所有连续数字串单独提取,不管冒号,因此把13:30拆成13和30,不符合保留时间格式的需求。

内容的提问来源于stack exchange,提问作者neural science

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 01:12:38