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

Python中如何使用regex从混合字符串中提取含特殊分数格式的数值令牌

你合并规则后无法得到预期结果主要有两个原因:

  • 正则分支匹配按从左到右的顺序执行,你把短数字的匹配规则放在了前面,会先匹配到1这种独立数字,不会继续向后尝试匹配1 and 1/2这种更长的带分数结构
  • 两个分支的捕获组设置不统一,第一个分支设置了捕获组,第二个分支没有设置,re.findall会优先返回捕获组内容,导致带分数的匹配结果为空

解决方案

调整正则的匹配顺序,优先匹配长的带分数结构,再匹配小数、整数,最后匹配普通单词,所有待提取内容放在同一个捕获组中即可:

import re

s = "Score 1 and 2 sometimes, often 1 and 1/2, or 2.5 or 3 and 1/3."
# 匹配顺序:带分数 > 小数/整数 > 普通单词,自动过滤标点符号
pattern = r'(\d+ and \d+\/\d+|\d*\.?\d+|[a-zA-Z]+)'
tokens = re.findall(pattern, s)

for token in tokens:
    # 判断令牌类型
    if re.fullmatch(r'\d+ and \d+\/\d+|\d*\.?\d+', token):
        print(f"{token} -> number")
    else:
        print(f"{token} -> word")

运行输出

Score -> word
1 -> number
and -> word
2 -> number
sometimes -> word
often -> word
1 and 1/2 -> number
or -> word
2.5 -> number
or -> word
3 and 1/3 -> number

如果需要更严格的空格校验避免特殊场景误判,可以在正则中补充前后空格的匹配逻辑,上述写法已经可以覆盖你给出的示例需求。

内容的提问来源于stack exchange,提问作者Droid-Bird

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:27:05