如何限制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演示。
\1
在([a-zA-Z])将捕获了一封信,0+将匹配1个或多个零。
([a-zA-Z])
0+
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。
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组的内容(第一个前导零之后的剩余数字)。
r'(?<=[a-zA-Z])0+(\d*)'
(?<=[a-zA-Z])
(\d*)
0