Используйте
re.compile('">(CVE.*?)</a>')
# instead of your re.compile('\>"(CVE.*)"\<\/a>')
Обратите внимание, что символы <> / не нужно экранировать в шаблоне регулярных выражений
И обратите внимание, что символ ?
после .*
останавливает жадное поведение квантификатора *
для того, чтобы совпадение прекратилось, когда был принят первый </a>
. Смотрите документы по этому вопросу, это фундаментально
.
Иногда возникают проблемы при использовании re
для анализа текста XML | GML
Однажды мне сказали, что одна из возможных проблем заключается в том, что тег может быть записан в несколько строк, например:
<code>ss = '''
<pre>
<a href="https://www.redhat.com/security/data/cve/CVE-2010-3718.html">CVE-20
10-371
8</a>
''»
В этом случае совпадения не будет, потому что точка, используемая в качестве символа в шаблоне регулярного выражения, не символизирует символ новой строки '\ n'. Таким образом, часть .*?
шаблона не будет позволять переходить от строки к строке.
Чтобы исправить эту проблему, используйте спецификацию re.DOTALL
, которая дает символу точки возможность представлять любые символы.
.
Обратите внимание, что по общему убеждению инструмент re не должен использоваться для анализа текста SGML или XML. Но мало кто в состоянии объяснить, почему. И я один из тех людей, которые точно не знают, почему.
Но лично я думаю, что регулярное выражение может действительно использоваться для анализа текстов. Я пишу «АНАЛИЗ», а не «ПАРС».
Насколько я понял, синтаксический анализ - это процесс анализа текста И построения его древовидного представления на основе тегов.
В то время как я определяю анализ текста как ... анализ его без цели получить представление дерева.
Когда древовидное представление не требуется для извлечения данных из текста, используйте регулярные выражения и не слушайте парней, которые имеют религиозные соображения по этому вопросу, как в смешном, но, на мой взгляд, обманчивом посте, чья ссылка была дана