Регулярное выражение вида "ZZ(произвольное количество любых символов)XX"
Мне нужно составить регулярное выражение вида:
'ZZ(тут произвольное количество любых символов)XX'
Нужно найти первое вхождение этого шаблона в текст, допустим:
'df q ZZtp ot03-#3 rer#RXX df;l,gm XXpo45ZZ dsfdfdscv'
В данном случае нужна вот эта подстрока 'ZZtp ot03-#3 rer#RXX'.
Регулярка типа:
re.findall(r'ZZ.+XX', 'df q ZZtp ot03-#3 rer#RXX df;l,gm XXpo45ZZ dsfdfdscv')
находит наибольшую подстроку 'ZZtp ot03-#3 rer#RXX df;l,gm XX', это мне не подходит.
Ответы (1 шт):
Используйте нежадное выражение, т.е. ZZ.+?XX
О жадности
Регулярные выражения по умолчанию "жадные", т.е. захватывают наибольшее возможное число символов.
Эта проблема была ещё со времён регулярных выражений POSIX.
Пример:
Регулярное выражение: \".+\".
Текст: Просто "что-то", но "в кавычках". А это - без них..
Тогда совпадение будет одно: "что-то", но "в кавычках"
Если нам нужны все выражения в кавычках, это нам не подходит.
Как этого избежать
После операторов +, *, ? и {} можно поставить ?, тогда жадность отключится.
Например, в том же тексте будут два совпадения: "что-то" и "в кавычках", если регулярное выражение будет: \".+?\", т.е.:
- Кавычка
- Хотя бы один символ, но чем меньше, тем лучше.
- Кавычка.
Ещё один метод
Т.к. мы знаем, что в выражении в кавычках их не может быть(кроме первой и последней), мы можем написать так:
\"[^"]+\".
Так мы обойдёмся без отключения жадности.