Python正则表达式;替换匹配的一部分

2024-10-01 07:10:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

输入和输出示例

e004_n07 #e4_n7
e020_n50 #e20_n50
e000_n00 #e0_n0

这可以用re.sub公司一个人,还是我需要使用搜索/re.匹配?在


Tags: 字符串re示例数字前导e4e0n07
3条回答

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

([a-zA-Z])0+

替换为\1反向引用。参见regex demo。在

([a-zA-Z])将捕获一个字母,0+将匹配1个或多个零。在

Python demo

^{pr2}$

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

UDPATE

如果数字只包含零,要保持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*)'regex匹配ASCII字母((?<=[a-zA-Z]))后面的一个或多个零(0+),然后用(\d*)将任何其他数字(0或更多)捕获到组1中。然后,在替换中,我们检查组1是否为空,如果它是空的,我们插入0(只有零),否则,我们插入第1组的内容(第一个前导零之后的剩余数字)。在

如果您的要求是必须使用regex,那么下面是您的regex模式:

>>> import re
>>> s = 'e004_n07'
>>> line = re.sub(r"0", "", s)
>>> line
'e4_n7'

但是,当有其他有效的方法来执行相同的操作时,建议不要使用regex,即使用replace函数

^{pr2}$

如果您的替代品如此简单,则无需使用re.sub,只需使用str.replace

s = 'e004_n07'
s.replace('0', '') # => 'e4_n7'

相关问题 更多 >