我需要通过一个reg表达式匹配两个案例并进行替换
'long.file.name.jpg' - >'long.file.name_ suff .jpg'
'long.file.name_ a .jpg' - >'long.file.name_ suff .jpg'
我正在尝试做以下事情
re.sub('(\_a)?\.[^\.]*$' , '_suff.',"long.file.name.jpg")
Run Code Online (Sandbox Code Playgroud)
但这是延长'.jpg'并且我得到了
long.file.name_suff.而不是long.file.name_suff.jpg我明白这是因为[^.]*$ part,但我不能排除它,因为我必须找到最后出现的'_a'来替换或持续'.'
有没有办法只替换部分比赛?
Amb*_*ber 95
在要保留的部件周围放置一个捕获组,然后在替换文本中包含对该捕获组的引用.
re.sub(r'(\_a)?\.([^\.]*)$' , r'_suff.\2',"long.file.name.jpg")
Run Code Online (Sandbox Code Playgroud)
Ama*_*osh 26
re.sub(r'(?:_a)?\.([^.]*)$', r'_suff.\1', "long.file.name.jpg")
Run Code Online (Sandbox Code Playgroud)
?:启动一个非匹配组(SO答案),所以(?:_a)匹配_a但不枚举它,以下问号使它成为可选.
因此,在英语中,这表示匹配.<anything>模式后面(或没有)的结尾_a
另一种方法是使用lookbehind(见这里).提到这一点是因为它们非常有用,但我15年来一直不知道这些RE
Gum*_*mbo 10
只需将扩展的表达式放入一个组中,捕获它并引用替换中的匹配:
re.sub(r'(?:_a)?(\.[^\.]*)$' , r'_suff\1',"long.file.name.jpg")
Run Code Online (Sandbox Code Playgroud)
此外,使用非捕获组(?:…)将阻止重新存储许多不需要的信息.
您可以通过从更换中排除零件来实现.我的意思是,你可以对正则表达式模块说; "与这种模式匹配,但替换它的一部分".
re.sub(r'(?<=long.file.name)(\_a)?(?=\.([^\.]*)$)' , r'_suff',"long.file.name.jpg")
>>> 'long.file.name_suff.jpg'
Run Code Online (Sandbox Code Playgroud)
long.file.name和.jpg部分用于匹配,但它们不包括在替换中.