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

Mav*_*ckD 1 python regex

我有一个这种格式的文件名,

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

我这样做是为了匹配.javaunderscores

\.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通话中完成以上操作

The*_*ird 5

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

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

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 次
  • (?=_[^_]) 肯定前瞻断言接下来是下划线后跟不是下划线

演示 Python