小编典典

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

python

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

输入和输出示例

e004_n07 #e4_n7
e020_n50 #e20_n50
e000_n00 #e0_n0

是否可以单独使用re.sub完成此操作,还是需要使用re.search/re.match?


阅读 224

收藏
2021-01-20

共1个答案

小编典典

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

([a-zA-Z])0+

替换为\1反向引用。请参阅regex演示

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

Python演示

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

请注意,这 re.sub
将查找并替换所有不重叠的匹配项(将执行全​​局搜索并替换)。如果不匹配,则将按原样返回字符串,而无需进行修改。因此,无需使用额外的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演示

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

2021-01-20