Выделить повторяющееся слово в строчке со словами через _, используя regex

Есть строка proba_m4050_434_3g3_3g3.png

Хотелось бы подобрать регулярное выражение, чтобы выделить последнее _3g3 и заменить на пустоту (proba_m4050_434_3g3.png). Проблема в том, что таких строк много (поэтому пробую пакетное переименование), части навроде 3g3 могут состоять не всегда из трёх символов, а в некоторых файлов и вовсе нет дублирующей части, то есть они сразу выглядит так, как мне нужно.

Все файлы начинаются с proba_m, части отделяются нижним подчеркиванием.

В тех ответах, что находил ранее, выражение рассматривало строчку, где слова отделяются пробелом, что не мой случай.

Пример ожидаемого преобразования

Было:

proba_m4050_434_3g3_3g3.png
proba_m313_313.png
proba_m5214_2520_gb54_gb54.png
proba_m141_18d5_fd071_fd071.png
proba_m312_534_430_39g.png
proba_m3501_5721.png

Стало:

proba_m4050_434_3g3.png 
proba_m313.png
proba_m5214_2520_gb54.png
proba_m141_18d5_fd071.png 
proba_m312_534_430_39g.png (нет дублирования, без изменений)
proba_m3501_5721.png (нет дублирования, без изменений)

Ответы (1 шт):

Автор решения: Laukhin Andrey

Нужно использовать обратные ссылки (backreferences).
Само регулярное выражение получается тривиальным:

(_\w+)\1+

Квантификатор + в конце позволяет находить не только две повторяющиеся последовательности, а любое их количество. Если принципиально только две, то + можно убрать.

Замену производим не на пустую строку, а на захваченную группу.

Проверка

Чтобы ограничить поиск только в конце наименования (перед расширением), нужно дополнить выражение:

(_\w+)\1+\.

Замена производится на захваченную группу с точкой $1.

Проверка

→ Ссылка