Python RegEx: жадность с конца строки
Никак не могу разобраться с правильным паттерном для RegEx. Есть файлик с кучей строк следующего вида:
- "Lorem, ipsum, dolor, sit, gotcha"
- "Lorem, ipsum, go7ch4"
- "Lorem, ipsum, dolor, g0tch4"
Мне нужно написать код, который бы находил во всех строках последнее слово. И я никак не могу сделать так, чтобы мой паттерн перестал быть жадным. Вот мой код:
def gotcha_exctractor(line):
pattern = re.compile(', (.+?)$')
match = pattern.search(line)
return match
В лучшем случае, когда строка имеет вид "Lorem, gotcha", функция работает нормально, но если сунуть в нее строку длиннее, она выдает слишком много. Например, при "Lorem, ipsum, gotcha" я получаю "ipsum, gotcha". Понятно, что под мой паттерн подходит и ", gotcha", и ", ipsum, gotcha", и что мне нужно куда-то воткнуть таблетку от жадности, но у меня что-то не выходит. Вроде, документация говорит, что для этого нужно сувать "?" после спецификаторов "+", "*" и "?", но у меня ничего не робит. Как сделать, чтобы это все дело было менее жадным?
Ответы (1 шт):
Регулярное выражение ищет совпадение в строке слева направо. В выражении , (.+?)$ первым символом идёт запятая, значит, в Lorem, ipsum, dolor, sit, gotcha будет найдена первая запятая, та, что после Lorem. Дальше, после запятой будет найден пробел. Затем (.+?) найдёт i в ipsum, и тут же после этого $ попробует определить, в конце ли строки находится индекс. Так как это неправда, в дело вступает backtracking: (.+?) захватывает ip и снова $ проверяет, находимся ли мы в конце строки или нет. И так далее, пока (.+?) не захватит целую строку.
Вы можете использовать
,\s*([^\s,]+)$
,\s*(\w+)$
,\s*(\w+)\s*$
Смысл в том, чтобы ограничить . так, чтобы он не находил любой символ. \w+ найдет 1 и более цифр/букв/_, [^\s,]+ найдёт 1 и более символов, отличных от пробельных символов и запятых.