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

2024-05-16 00:08:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要用一个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")

但这是剪掉的分机。jpg和我得到

长文件名。而不是long.file.name_suff.jpg 我知道这是因为[^.]*$部分,但我不能排除它,因为 我必须找到最后出现的'u a'来替换或最后'

有没有办法只替换比赛的一部分?


Tags: namegtre表达式文件名reg事情long
3条回答

在要保留的部分周围放置一个捕获组,然后在替换文本中包含对该捕获组的引用。

re.sub(r'(\_a)?\.([^\.]*)$' , r'_suff.\2',"long.file.name.jpg")
 re.sub(r'(?:_a)?\.([^.]*)$', r'_suff.\1', "long.file.name.jpg")

?:启动一个不匹配的组(SO answer),因此(?:_a)正在匹配_a,但没有枚举它,下面的问号使其成为可选的。

所以在英语中,这是说,匹配尾数.<anything>,它遵循(或不遵循)模式_a

另一种方法是使用lookbehindsee here)。提到这个是因为它们非常有用,但我15年来都不知道它们的用途

只需将扩展名的表达式放入一个组中,捕获它并在替换项中引用匹配项:

re.sub(r'(?:_a)?(\.[^\.]*)$' , r'_suff\1',"long.file.name.jpg")

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

相关问题 更多 >