2013-03-08 2 views
0

У меня есть два почти идентичных выражения, и я получаю один хороший и другой способ неправильного вывода.simple regex issue

data/holidays/photos-2012-2013/word-another-more-more-5443/"><span class="bold">word another</span> - word</a>  

regex = 'data/holidays/photos-2012-2013/.+?(\d{4})/"><span class="bold">(.+?)</span>(.+?)</a>' 

word-another-more-more, word another и word, все это в приведенных выше изменений. Вышеприведенные печатает правильно, список кортежей, как это: ('6642', 'word another', ' - word')

data/holidays/photos-2012-2013/word-another-more-more-5443/">word- another - <span class="bold">word another</span></a> 

regex1 = 'data/holidays/photos-2012-2013/.+?(\d{4})/">(.+?)<span class="bold">(.+?)</span></a>' 

Это выше печатает некоторые мусор код, несмотря на синтаксис, используемый в idential. Вывод - это список, содержащий кортежи, но полон нежелательного кода.

Вы видите, что не так во втором регулярном выражении?

+5

Пожалуйста, не пытайтесь анализировать HTML с регулярными выражениями. Почему бы не использовать парсер HTML вместо этого? –

+3

Если это так просто, зачем вам нужна помощь? :-) – paxdiablo

+2

Я согласен с Martijn Pieters, использование регулярного выражения почти гарантированно завершится неудачей для синтаксического разбора HTML; вы, скорее всего, добьетесь успеха, если вместо этого вы можете использовать парсер XML/HTML. В целом, как общее предложение, я бы сказал, попробуйте запустить ваш вход через симулятор по адресу http://regexpal.com/ и посмотреть, работает ли ваше регулярное выражение так, как вы думаете. – neilr8133

ответ

1

работает для меня:

>>> import re 
>>> text = 'data/holidays/photos-2012-2013/word-another-more-more-5443/">word- another - <span class="bold">word another</span></a>' 
>>> re.findall(r'data/holidays/photos-2012-2013/.+?(\d{4})/">(.+?)<span class="bold">(.+?)</span></a>', text) 
[('5443', 'word- another - ', 'word another')] 

Примечание: пожалуйста не разобрать HTML с регулярным выражением. BeautifulSoup есть только по этой причине.