re.sub在单个调用中用多个不同的单词替换多个模式

时间:2018-06-21 00:55:41

标签: python regex

我有这种格式的文件名,

remote_execute___jenkin%.java
remtoe__plat_jenk.java

我想用单个_代替所有出现的两个或三个_

我已经做到了,

re.sub('_{2,3}','_',name)

这有效,并将所有出现的两个或三个_替换为单个_。但是在相同的re.sub调用中,我需要将.java替换为.jav

我这样做是为了匹配.javaunderscores

\.java$|_{2,3}

但是在替换.java之后如何在同一re.sub调用中替换re.sub而又不使用另一个underscores

现在我正在这样做,

name = re.sub('_{2,3}','_',name)
name = re.sub('\.java$','jav',name)

我想在一个re.sub通话中完成上述操作

2 个答案:

答案 0 :(得分:4)

对于示例数据,您可以使用:

_(?=_)|(?<=\.jav)a$

import re
name = "remote_execute___jenkin%.java"
print(re.sub('_(?=_)|(?<=\.jav)a$', "", name))

这将匹配

  • _(?=_)匹配一个下划线,并使用正向前行来断言其后是一个下划线,该下划线将与前导下划线匹配,而与_____中的最后一个下划线不匹配< / li>
  • |
  • (?<=\.jav)a$肯定会向后断言左侧是.jav,并在行尾匹配a

如果下划线的出现次数必须是2次或3次,则可以使用:

(?<!_)_{1,2}(?=_[^_])|(?<=\.jav)a$

匹配2个或3个下划线的部分:

  • (?<!_)在后​​面加负号可以断言左侧不是下划线
  • _{1,2}匹配下划线1或2次
  • (?=_[^_])积极前瞻,断言其后是下划线而不是下划线

Demo Python

答案 1 :(得分:1)

嵌套re.sub可以正常使用

name = re.sub('_{2,3}','_',re.sub('\.java$','jav',name))