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

Python re模块正则表达式无法提取数字Token,请求排查

问题排查:提取数字Token失败

你的代码存在几个关键问题,导致无法得到预期结果:

1. 正则表达式拼接逻辑错误

你把两个完全无关的正则规则直接拼接在一起,最终生成的正则是(?P<int>\d+)(^((P=int)\s?)*$)。这个表达式要求字符串同时满足:开头是数字,并且整个字符串完全由P=int(可带空格)重复组成,这显然和你的输入"12 34 56 + - * / %"完全不匹配。

2. 使用了错误的匹配方法

re.match()只会匹配字符串的开头位置,即便正则规则正确,也只能拿到第一个数字;而你的拼接正则本身就和输入内容不匹配,自然返回None。要提取所有符合规则的Token,应该用re.findall()或者re.finditer()。

3. 冗余规则干扰

rules里的Test规则和提取数字的需求完全无关,属于无效规则,应该直接移除。


修正后的代码

import re

def main():
    # 只保留提取数字的规则
    number_pattern = r"\d+"
    p = re.compile(number_pattern)
    # 使用findall提取所有匹配的数字
    result = p.findall("12 34 56 + - * / %")
    if result:
        print(result)
    else:
        print("No matches")

if __name__ == '__main__':
    main()

运行后会输出预期的['12', '34', '56']。

如果需要保留命名分组(比如后续要区分Token类型),可以用finditer()来获取每个匹配的分组信息:

import re

def main():
    rules = {
        'number' : r"(?P<int>\d+)"
    }
    # 直接使用数字规则即可,不需要拼接无关规则
    p = re.compile(rules['number'])
    matches = p.finditer("12 34 56 + - * / %")
    # 提取所有分组中的数字
    result = [match.group('int') for match in matches]
    print(result)

if __name__ == '__main__':
    main()

内容的提问来源于stack exchange,提问作者Kya Beaudry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:42:15