Python正则表达式;替换部分比赛
如何限制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演示。在
([a-zA-Z])
将捕获了一封信,0+
将匹配1个或多个零。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组的内容(第一个前导零之后的剩余数字)。