Регулярное выражение не может соответствовать "</p>" правильно - PullRequest
2 голосов
/ 23 мая 2019

каждый.

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

</p>

Я использую unsung hero.*</p> для поиска в абзацеЯ заинтересован, но не могу сделать так, чтобы он совпадал до следующего </p>

Я использую команду:

egrep "unsung hero.*</p>" test

и в тесте это веб-страница, подобная:

<p>There are going to be outliers among us, people with extraordinary skill at recognizing faces. Some of them may end up as security officers or gregarious socialites or politicians. The rest of us are going to keep smiling awkwardly at office parties at people we\'re supposed to know. It\'s what happens when you stumble around in the 21st century with a mind that was designed in the Stone Age.</p>\n    <p>(SOUNDBITE OF MUSIC)</p>\n    <p>VEDANTAM: This week\'s show was produced by Chris Benderev and edited by Jenny Schmidt. Our supervising producer is Tara Boyle. Our team includes Renee Cohen, Parth Shah, Laura Kwerel, Thomas Lu and Angus Chen.</p>\n    <p>Our unsung hero this week is Alexander Diaz, who troubleshoots technical problems whenever they arise and has the most unflappable, kind disposition in the face of whatever crisis we throw his way. Producers at NPR have taken to calling him Batman because he\'s constantly, silently, secretly saving the day. Thanks, Batman.</p>\n    <p>If you like today\'s episode, please take a second to share it with a friend. We\'re always looking for new people to discover our show. I\'m Shankar Vedantam, and this is NPR.</p>\n    <p>(SOUNDBITE OF MUSIC)</p>\n\n    <p class="disclaimer">Copyright &copy; 2019 NPR.  All rights reserved.  Visit our website <a href="https://www.npr.org/about-npr/179876898/terms-of-use">terms of use</a> and <a href="https://www.npr.org/about-npr/179881519/rights-and-permissions-information">permissions</a> pages at <a href="https://www.npr.org">www.npr.org</a> for further information.</p>\n\n    <p class="disclaimer">NPR transcripts are created on a rush deadline by <a href="http://www.verb8tm.com/">Verb8tm, Inc.</a>, an NPR contractor, and produced using a proprietary transcription process developed with NPR. This text may not be in its final form and may be updated or revised in the future. Accuracy and availability may vary. The authoritative record of NPR&rsquo;s programming is the audio record.</p>\n</div><div class="share-tools share-tools--secondary" aria-label="Share tools">\n      <ul>\n

Я ожидаю совпадения до

</p>\n    <p>If you like

Но на самом деле дело пошло гораздо дальше.

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

Спасибо!

20190523: Спасибо за предложения ваших парней.

Я пытался

egrep "unsung hero.*?</p>" test

Но это не такдайте мне результат, который я хочу, insted это как test result of .*?

Лео, я чувствую, что это полезное выражение, и я хотел бы получить его правильно.Не могли бы вы объяснить немного?

Другой тест, который я сделал для

[^<]*

Фактически дал ожидаемый результат enter image description here

1 Ответ

3 голосов
/ 23 мая 2019

При .* совпадение будет жадным и будет соответствовать самой длинной из возможных подстрок. (Что в вашем случае до последнего абзаца.)

То, что вы на самом деле хотите - это не жадное совпадение с .*?

Ваша конкретная команда, скорее всего, должна выглядеть так:

grep -P -o "unsung hero.*?</p>" test

Другим решением было бы расширить регулярное выражение до конца строки / веб-страницы, а затем выбрать выделенную подстроку с группой.

UPDATE

Как правильно заметил Чарльз Даффи, это не будет работать со стандартным синтаксисом (POSIX ERE). Поэтому команда выше использует флаг -P, чтобы указать, что это регулярное выражение perl.

Если ваша система или приложение не поддерживает регулярное выражение perl, и вы согласны с сопоставлением до первого < (вместо сопоставления до первого </p>), сопоставление с каждым символом, кроме <, - путь .

В этом случае полная команда должна выглядеть так:

grep -o "unsung hero[^<]*</p>" test

Спасибо Чарльзу за то, что указал на это в комментариях.

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