如何用python re.sub替换部分匹配

Art*_*rty 55 python regex

我需要通过一个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)

  • @cryanbhu 括号中的任何内容都会成为一个组。组按出现顺序编号,随后可以通过反斜杠后跟数字来引用。在示例中,\2 引用第二组。单个反斜杠就足够了,因为将 r 放在字符串之前会将其视为原始字符串。如果没有前面的 r , \\2 将引用该组。在python的re包的“正则表达式语法”文档中,相关部分是 (...) 和 \number 。此外,\ 业务在开头就得到了解释(第三段,截至今天)。 (4认同)

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)

此外,使用非捕获组(?:…)将阻止重新存储许多不需要的信息.


Ahm*_*DAL 7

您可以通过从更换中排除零件来实现.我的意思是,你可以对正则表达式模块说; "与这种模式匹配,但替换它的一部分".

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部分用于匹配,但它们不包括在替换中.