我如何限制匹配/替换e004_n07中的前导零?但是,如果任一项都包含全零,那么我需要在该项中保留一个零(参见下面的示例)。对于输入字符串,第一个值中总是有3个数字,第二个值中总是有2个数字。
输入和输出示例
e004_n07 #e4_n7
e020_n50 #e20_n50
e000_n00 #e0_n0
这可以单独使用re.sub来完成,还是需要使用re.search/re.match?
答案 0 :(得分:4)
如果您只想在字母后删除零,可以使用:
Window > Appearance -> font consolas greatly helped the readibility, not sure if that helped with the issue or not.
替换为([a-zA-Z])0+
反向引用。请参阅regex demo。
\1
将捕获一封信,([a-zA-Z])
将匹配1个或多个零。
0+
请注意re.sub
将查找并替换所有非重叠匹配(将执行全局搜索和替换)。如果没有匹配,则字符串将按原样返回,无需修改。因此,无需使用其他import re
s = 'e004_n07'
res = re.sub(r'([a-zA-Z])0+', r'\1', s)
print(res)
/ re.match
。
<强> UDPATE 强>
如果数字仅包含零,则保持1为零,您可以使用
re.search
请参阅Python demo
此处,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)
正则表达式匹配ASCII字母(r'(?<=[a-zA-Z])0+(\d*)'
)之后的一个或多个零(0+
),然后将任何其他数字(0或更多)捕获到组中1与(?<=[a-zA-Z])
。然后,在替换中,我们检查组1是否为空,如果它是空的,我们插入(\d*)
(只有零),否则,我们插入组1内容(第一个前导零之后的剩余数字) )。
答案 1 :(得分:1)
如果您的替换是如此简单,则无需使用re.sub
- 只需使用str.replace
:
s = 'e004_n07'
s.replace('0', '') # => 'e4_n7'
答案 2 :(得分:0)
如果您的要求是必须使用regex
,那么下面是您的正则表达式模式:
>>> import re
>>> s = 'e004_n07'
>>> line = re.sub(r"0", "", s)
>>> line
'e4_n7'
但是,当有其他有效的方法来执行相同的操作时,建议不要使用正则表达式,即使用replace
函数
>>> line = s.replace('0', '')
>>> line
'e4_n7'
答案 3 :(得分:0)
编辑:不要让任何人与您讨论验证固定数据的格式。如果这就是你需要的东西,不要过于简单。
不是很漂亮,但在一个看似固定的情况下,你可以只是
设置所有排列,然后盲目捕捉好的部分,
忽略零,然后将其全部替换掉。
查找With objMail
.AddAttachment "E:\xxx.com\files\image\photos\members\me.jpg"
.Update
End With
替换([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)
)