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

时间:2016-08-29 19:18:16

标签: python regex

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

输入和输出示例

e004_n07 #e4_n7
e020_n50 #e20_n50
e000_n00 #e0_n0

这可以单独使用re.sub来完成,还是需要使用re.search/re.match?

4 个答案:

答案 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个或多个零。

Python demo

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)
 )