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

