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
相关产品推荐
相关产品推荐

