我试图实现以下目标:
string = 'C:/some path to mp3/song (7) title and so on (1).mp3'
应该成为:
C:/some path to mp3/song (7) title and so on.mp3
为了匹配它我使用以下正则表达式:
pattern = '.*(\s\([0-9]+\))\.mp3'
匹配组包含:(u' (1)',)
但是,当我试图像这样替换比赛时:
processed = re.sub(pattern, '', string)
处理包含一个空字符串。 我怎样才能让re.sub()只替换上面找到的匹配?
答案 0 :(得分:2)
您匹配整个字符串并替换它,使用前瞻,只在最后一次扩展之前匹配空格和(1)
。
扩展RegEx:
\s* (?# 0+ characters of leading whitespace)
\( (?# match ( literally)
[0-9]+ (?# match 1+ digits)
\) (?# match ) literally)
(?= (?# start lookahead)
\. (?# match . literally)
mp3 (?# match the mp3 extension)
$ (?# match the end of the string)
) (?# end lookeahd)
演示: Regex101
<强>实施强>
pattern = '\s*\([0-9]+\)(?=\.mp3$)'
processed = re.sub(pattern, '', string)
备注:强>
mp3
可以替换为[^.]+
以匹配任何扩展名,(mp3|mp4)
可以匹配多个扩展名。\s+
代替\s*
在(1)
之前要求至少一些空格,感谢@SethMMorton 。