如何用Python正则提取带连字符的年龄数字,得到预期元组格式结果
正则修改方案与实现
错误原因
你之前的正则存在两个核心问题:
- 仅支持匹配单数字:
[0-9]?、[0-9]都只能匹配0或1位数字,天然无法正确匹配10这类多位数 - 分支匹配优先级错误:正则分支会优先匹配左侧规则,
[0-9]|10的写法下,遇到10时会先匹配到[0-9]规则取第一个字符1,剩余的0再匹配对应规则,最终得到(1,0)的错误结果,即使调整分支顺序为10|[0-9]也只能兼容10这一个特殊双位数,无法适配11、20等其他多位数场景。
正确正则与实现代码
使用r'(\d+)(?:-(\d+))?years'作为匹配规则,逻辑说明:
\d+:匹配1位及以上的数字,支持任意位数的年限(?:-(\d+))?:非捕获组匹配可选的横杠+第二个数字,?:表示该组只做匹配不进入捕获结果,末尾的?表示整个横杠加第二个数字的结构是可选的,适配单数字年限场景
完整Python实现代码:
import re text = "1-2years. 3years. 10years." matches = re.findall(r'(\d+)(?:-(\d+))?years', text) result = [] for match in matches: if match[1]: # 存在第二个数字,即横杠分隔的场景 result.append((int(match[0]), int(match[1]))) else: # 单数字场景 # 注意Python中(3)属于int类型,单元素元组需要写为(3,),如果确实需要单元素无逗号的形式直接存int即可 result.append(int(match[0])) # 如果要严格对齐元组格式,替换为:result.append((int(match[0]),)) print(result) # 输出:[(1, 2), 3, 10] 或 [(1, 2), (3,), (10,)] 依你存储逻辑调整
内容的提问来源于stack exchange,提问作者Alalalalaki
相关产品推荐
相关产品推荐

