Регулярное выражение — Соответствует последнему вхождению круглых скобок

#python #regex #pattern-matching #regex-lookarounds #regexp-replace

Вопрос:

В приведенной ниже строке я пытаюсь получить подстроку (2005, Penguin Classics) подстроки.

Маршалл Б. Розенберг Доктор философии — Удивительная цель Anger_ За пределами управления гневом_ Поиск дара (Руководства по ненасильственному общению) (2005, Penguin Classics) AAA.pdf

Я делаю это, чтобы изменить подстроку на just (2005).

Ниже приведено мое текущее решение, но оно соответствует обоим (Nonviolent Communication Guides) и (2005, Penguin Classics) . Есть идеи, как это исправить?

 import re

parentheses_pattern = "(([^)] ))*$"
reg = re.search(parentheses_pattern, filename)
year = reg.group()
year = year[:5] ")"
filename = re.sub(parentheses_pattern,year,filename)
 

Ответ №1:

Может быть, это сработает?

 (d , .*)
 

Хорошее место для проверки вашего регулярного выражения-это: https://rubular.com/

На всякий случай, если это пригодится! 🙂

Комментарии:

1. Спасибо! Разве это не сработает, если первая подстрока будет содержать начальные цифры?

2. Это было бы не так из-за запятой и пробела в регулярном выражении. Так что даже если это: […](23 Руководства по ненасильственному общению) (2005, Penguin Classics)[…] он все равно выберет нужную вам подстроку.

Ответ №2:

Возможно, это поможет:

 r"(([^)] ))[^(]*$"
 

Комментарии:

1. Спасибо! Какая польза от символа r в начале?

2. Кстати, это не работает, так как усекает расширение файла (.pdf) в конце

3. Я думал, что цель состояла в том, чтобы сопоставить содержимое в последнем вхождении круглых скобок, что и делает шаблон. В любом случае, вы можете попробовать r"(([^)] ))(?=[^(]*$)" вместо этого.