Regular Expressions
Ловушки Regex
Поиск…
Почему точка (.) Не соответствует символу новой строки ("\ n")?
.*
в регулярном выражении в основном означает «поймать все до конца ввода».
Итак, для простых строк, таких как hello world
, .*
работает отлично. Но если у вас есть строка, представляющая, например, строки в файле, эти строки будут разделены разделителем строк , например \n
(новая строка ) в Unix-подобных системах и \r\n
(возврат каретки и новая строка) на Окна.
По умолчанию в большинстве движков регулярных выражений .
не соответствует символам новой строки, поэтому совпадение останавливается в конце каждой логической строки . Если хочешь .
чтобы соответствовать действительно всему, включая новые строки, вам нужно включить режим «dot- re.DOTALL
-all» в выбранном вами двигателе регулярных выражений (например, добавить флаг re.DOTALL
в Python или /s
в PCRE.
Почему регулярное выражение пропускает некоторые закрывающие скобки / круглые скобки и сопоставляет их потом?
Рассмотрим этот пример:
Он вошел в кафе «Достоевский» и сказал: «Добрый вечер».
Здесь мы имеем два набора котировок. Предположим, мы хотим сопоставить оба, так что наше регулярное выражение совпадает с "Dostoevski"
и "Good evening."
Сначала у вас может возникнуть соблазн сохранить его просто:
".*" # matches a quote, then any characters until the next quote
Но это не работает: оно соответствует первой цитате в "Dostoevski"
и до заключительной цитаты в "Good evening."
, включая and said:
часть. Демо-версия Regex101
Почему так случилось?
Это происходит из-за механизма регулярных выражений, когда он встречается .*
, «Съедает» весь вход до самого конца. Затем он должен соответствовать финалу "
. Таким образом, он« отступает »от конца матча, отбрасывая согласованный текст до тех пор, пока первый "
будет найден - и это, конечно, последний "
в матче , в конце "Good evening."
.
Как предотвратить это и точно соответствовать первым котировкам?
Используйте [^"]*
. Он не ест все входные данные - только до первого "
, как это необходимо. Демо-версия Regex101