我有一个这种格式的文件名,
remote_execute___jenkin%.java
remtoe__plat_jenk.java
Run Code Online (Sandbox Code Playgroud)
我想_用 single替换所有出现的两个或三个_,
我已经这样做了,
re.sub('_{2,3}','_',name)
Run Code Online (Sandbox Code Playgroud)
这有效并将所有出现的两个或三个_替换为 single _。但在同一个re.sub电话中,我需要替换.java为.jav,
我这样做是为了匹配.java和underscores,
\.java$|_{2,3}
Run Code Online (Sandbox Code Playgroud)
但是如何在替换后不使用另一个调用的情况下.java在同一个re.sub调用中进行re.sub替换underscores,
现在我就是这样做的,
name = re.sub('_{2,3}','_',name)
name = re.sub('\.java$','jav',name)
Run Code Online (Sandbox Code Playgroud)
我想在一次re.sub通话中完成以上操作
对于您的示例数据,您可以使用:
import re
name = "remote_execute___jenkin%.java"
print(re.sub('_(?=_)|(?<=\.jav)a$', "", name))
Run Code Online (Sandbox Code Playgroud)
这将匹配
_(?=_)匹配下划线并使用正向前瞻来断言后面的下划线将匹配前导下划线并且不匹配__或___| 或者(?<=\.jav)a$正向后视断言左侧的内容与行尾的.javan 匹配a如果下划线必须出现 2 次或 3 次,您可以使用:
(?<!_)_{1,2}(?=_[^_])|(?<=\.jav)a$
匹配 2 或 3 个下划线的部分:
(?<!_) 使用否定回溯来断言左侧的内容不是下划线_{1,2} 匹配下划线 1 或 2 次(?=_[^_]) 肯定前瞻断言接下来是下划线后跟不是下划线