我有这种格式的文件名,
remote_execute___jenkin%.java
remtoe__plat_jenk.java
我想用单个_
代替所有出现的两个或三个_
,
我已经做到了,
re.sub('_{2,3}','_',name)
这有效,并将所有出现的两个或三个_
替换为单个_
。但是在相同的re.sub
调用中,我需要将.java
替换为.jav
,
我这样做是为了匹配.java
和underscores
,
\.java$|_{2,3}
但是在替换.java
之后如何在同一re.sub
调用中替换re.sub
而又不使用另一个underscores
,
现在我正在这样做,
name = re.sub('_{2,3}','_',name)
name = re.sub('\.java$','jav',name)
我想在一个re.sub
通话中完成上述操作
答案 0 :(得分:4)
对于示例数据,您可以使用:
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次(?=_[^_])
积极前瞻,断言其后是下划线而不是下划线答案 1 :(得分:1)
嵌套re.sub
可以正常使用
name = re.sub('_{2,3}','_',re.sub('\.java$','jav',name))