如何使用正则表达式从‘1903type18pieces’中删除‘18pieces’且保留开头数字
原正则失效原因
你写的re.sub("(?<!\d+)\d.+?$", "", string)无法生效有两个核心问题:
- Python标准
re库不支持可变长度的逆序环视,(?<!\d+)中的+属于不定长匹配,本身就不符合语法要求 - 匹配逻辑存在缺陷,即使支持不定长逆序环视,也无法准确区分「开头连续的数字段」和「后续出现的数字」
正确解决方案
方案1:匹配提取保留内容(逻辑最直观)
直接从字符串开头匹配需要保留的内容,提取匹配结果即可:
import re def trim_str(s): # ^ 匹配开头,\d* 匹配开头所有连续数字,\D* 匹配数字后所有非数字字符(直到碰到下一个数字为止) res = re.match(r'^\d*\D*', s) return res.group() if res else ''
方案2:替换删除无效内容(适合一行写完的场景)
如果习惯用sub直接替换删除,用如下写法即可:
import re # (?<=\D) 限定匹配的数字前面是非数字,不会命中开头的数字,\d.* 匹配该数字及之后的全部内容 result = re.sub(r'(?<=\D)\d.*', '', your_string)
效果验证
- 输入
1903type18pieces→ 输出1903type,符合需求 - 输入
12345→ 输出12345,全开头数字的场景完整保留 - 输入
type789test→ 输出type,无开头数字的场景下删除首个数字及后续内容 - 输入
2024abcdef→ 输出2024abcdef,后续无数字的场景完整保留
内容的提问来源于stack exchange,提问作者Z.Shuang
相关产品推荐
相关产品推荐

