2016-04-16 4 views
-3

Предположим, у меня есть следующая строка:FindAll() поведение (питон 2,7)

"<p>Hello</p>NOT<p>World</p>" 

и я хочу, чтобы извлечь слова Hello и World

я создал следующий скрипт для работы

#!/usr/bin/env python 

import re 

string = "<p>Hello</p>NOT<p>World</p>" 
match = re.findall(r"(<p>[\w\W]+</p>)", string) 

print match 

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

Интерпретатор печатает

так, очевидно, видит первый < р> и последний </P>, игнорируя в период между тегами. Не должно ли findall() вернуть все три набора совпадающих строк? (строка, которую он печатает, и два слова).

И если это не так, как я могу изменить код для этого?

PS: Это для проекта, и я нашел альтернативный способ сделать то, что мне нужно, так что это по образовательным причинам, я думаю.

+1

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – BrenBarn

ответ

1

Причина, по которой вы получаете все содержимое в одной игре, потому что [\w\W]+ будет соответствовать столько вещи, как это может (в том числе все ваши <p> и </p> тегов). Чтобы предотвратить это, вы хотите использовать не жадную версию, добавив ?.

match = re.findall(r"(<p>[\w\W]+?</p>)", string) 
# ['<p>Hello</p>', '<p>World</p>'] 

От documentation:

*?, +?, ??
The '*', '+' и '?' классификаторов все жадные; они соответствуют как можно большему количеству текста. Иногда такое поведение нежелательно; если RE <.*> соответствует <a> b <c>, он будет соответствовать всей строке, а не только <a>. Добавление ? после того, как квалификатор заставляет его выполнять матч не-жадным или минимальным образом; как можно меньше символов. Использование RE <.*?> будет соответствовать только <a>.

Если вы не хотите <p> и </p> тегов в результате, вы будете хотеть использовать смотреть вперед и смотреть за утверждениями, чтобы не включать их в результате.

match = re.findall(r"((?<=<p>)\w+?(?=</p>))", string) 
# ['Hello', 'World'] 

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

+0

Большое спасибо. Думаю, я упустил эту часть REs – persongr

+0

. Я также посмотрю на BeautifulSoup, спасибо за предложение. – persongr

+0

+1 для BeautifulSoup (или аналогичного). HTML не является обычным языком, поэтому регулярные выражения не являются хорошим инструментом для их анализа. Нам будет намного проще использовать библиотеку, которая понимает HTML. – nighthawk454