如何限制匹配/替换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
backreference。参见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
如果数字中只包含0,则可以使用
将1保留为0import 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*)'
regex匹配ASCII字母((?<=[a-zA-Z])
)后面的一个或多个零(0+
),然后使用(d*)
捕获任何其他数字(0或更多)到组1。然后,在替换中,我们检查组1是否为空,如果为空,我们插入0
(只有零),否则,我们插入组1的内容(第一个前导零之后的剩余数字)。
如果您的替换是如此简单,则无需使用re.sub
-只需使用str.replace
:
s = 'e004_n07'
s.replace('0', '') # => 'e4_n7'
如果你的要求是你必须使用regex
,那么下面是你的正则表达式模式:
>>> import re
>>> s = 'e004_n07'
>>> line = re.sub(r"0", "", s)
>>> line
'e4_n7'
然而,当有其他有效的方法来执行相同的操作时,建议不要使用regex,即使用replace
函数
>>> line = s.replace('0', '')
>>> line
'e4_n7'
edit:不要让任何人说服您不要验证固定数据的格式。如果这是你需要的,不要满足于过于简单的东西。
不是很漂亮,但在似乎固定的情况下,您可以使用
设置所有的排列,然后盲目地捕捉好的部分,
把零去掉,然后全部代回去。
查找([a-z])(?:([1-9][0-9][0-9])|0([1-9][0-9])|00([1-9]))(_[a-z])(?:([1-9][0-9])|0([1-9]))
替换$1$2$3$4$5$6$7
( [a-z] ) # (1)
(?:
( [1-9] [0-9] [0-9] ) # (2)
|
0
( [1-9] [0-9] ) # (3)
|
00
( [1-9] ) # (4)
)
( _ [a-z] ) # (5)
(?:
( [1-9] [0-9] ) # (6)
|
0
( [1-9] ) # (7)
)
输出 ** Grp 0 - ( pos 0 , len 8 )
e004_n07
** Grp 1 - ( pos 0 , len 1 )
e
** Grp 2 - NULL
** Grp 3 - NULL
** Grp 4 - ( pos 3 , len 1 )
4
** Grp 5 - ( pos 4 , len 2 )
_n
** Grp 6 - NULL
** Grp 7 - ( pos 7 , len 1 )
7