Skip to main content
 首页 » 编程设计

Python 正则表达式;替换部分比赛

2025年05月04日25hnrainll

我如何限制匹配/替换 e004_n07 中的前导零?但是,如果任一术语包含全零,那么我需要在该术语中保留一个零(参见下面的示例)。对于输入字符串,第一个值总是有 3 位数字,第二个值总是有 2 位数字。

示例输入和输出

e004_n07 #e4_n7 
e020_n50 #e20_n50 
e000_n00 #e0_n0 

这可以单独使用 re.sub 来完成,还是我需要使用 re.search/re.match?

请您参考如下方法:

如果你只想删除字母后的零,你可以使用:

([a-zA-Z])0+ 

替换为\1反向引用。查看regex demo .

([a-zA-Z])将捕获一封信和0+将匹配 1 个或多个零。

Python demo :

import re 
s = 'e004_n07' 
res = re.sub(r'([a-zA-Z])0+', r'\1', s) 
print(res) 

请注意 re.sub 将查找并替换所有非重叠匹配项(将执行全​​局搜索和替换)。如果没有匹配项,则字符串将按原样返回,不做任何修改。因此,无需使用额外的 re.match/re.search .

更新

如果数字只包含零,要保持 1 为零,您可以使用

import re 
s = ['e004_n07','e000_n00'] 
res = [re.sub(r'(?<=[a-zA-Z])0+(\d*)', lambda m: m.group(1) if m.group(1) else '0', x) for x in s] 
print(res) 

参见 Python demo

在这里,r'(?<=[a-zA-Z])0+(\d*)'正则表达式匹配 ASCII 字母 ( 0+ ) 之后的一个或多个零 ( (?<=[a-zA-Z]) ),然后任何其他数字 (0 或更多) 被捕获到第 1 组中 (\d*) .然后,在替换中,我们检查 Group 1 是否为空,如果为空,我们插入 0 (只有零),否则,我们插入第 1 组内容(第一个前导零之后的剩余数字)。