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 backreference。参见regex演示。

([a-zA-Z])将捕获一个字母,0+将匹配1个或多个零。

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

UDPATE

如果数字中只包含0,则可以使用

将1保留为0
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*)' 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  

最新更新