我需要用一个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'来替换或最后'
有没有办法只替换比赛的一部分?
在要保留的部分周围放置一个捕获组,然后在替换文本中包含对该捕获组的引用。
?:
启动一个不匹配的组(SO answer),因此(?:_a)
正在匹配_a
,但没有枚举它,下面的问号使其成为可选的。所以在英语中,这是说,匹配尾数
.<anything>
,它遵循(或不遵循)模式_a
另一种方法是使用lookbehind(see here)。提到这个是因为它们非常有用,但我15年来都不知道它们的用途
只需将扩展名的表达式放入一个组中,捕获它并在替换项中引用匹配项:
此外,使用非捕获组
(?:…)
将防止重新存储许多不需要的信息。相关问题 更多 >
编程相关推荐