Префикс Regex совпадает только тогда, когда в проверочном утверждении - PullRequest
0 голосов
/ 12 мая 2009

Я пытаюсь написать регулярное выражение для анализа (на первый взгляд, очень простого) фрагмента текста, подобного этому.

some stuff
First name: John
Last name: Smith
more stuff

Я хочу записать имя и фамилию, поэтому я попробовал следующее выражение:

(?<=First name:\s*)(?<FirstName>\w+)(?<=\s*Last name:\s*)(?<LastName>\w+)

Не удалось найти совпадение. Каждая часть (имя и фамилия) работает индивидуально, но они не работают вместе. Также следующие работы

(?<=John\s*Last name:\s*)(?<LastName>\w+)

но когда я вытаскиваю "Джона" из несоответствующей группы ...

John(?<=\s*Last name:\s*)(?<LastName>\w+)

... это не соответствует!

Что я здесь не так делаю?

Ответы [ 3 ]

1 голос
/ 12 мая 2009

Поскольку проверочные утверждения имеют нулевую ширину (т. Е. Они не потребляют никаких символов), захват FirstName будет соответствовать / захватывать все, что находится после «Имя:», в данном случае «Джон». После этого первого совпадения позиция в целевой строке будет сразу после «Джона». Но так как следующая часть регулярного выражения является еще одним предварительным просмотром, регулярное выражение будет проверять, соответствует ли то, что непосредственно предшествует его текущей позиции вашему вспомогательному тексту, в данном случае «Фамилия:». Так как ему фактически предшествует «Джон», все регулярные выражения терпят неудачу и даже не доходят до «Смита».

0 голосов
/ 12 мая 2009

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

В Python это означает передачу re.DOTALL в re.compile() или любую функцию re, которую вы используете. В Perl добавьте s после последней косой черты.

0 голосов
/ 12 мая 2009

Только что понял, что мне, вероятно, не нужен просмотр, потому что работает следующее:

First name:\s*(?<FirstName>\w+)\s*Last name:\s*(?<LastName>\w+)

Тем не менее, мне было бы интересно узнать, почему он не работает с поиском в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...