2014-11-27 3 views
1

У меня есть этот HTML тег:Как получить первое появление? регулярное выражение питона

x=""" <div>ad</div> \n\n <div> correct value </div> <div> wrong value </div> """ 

Я хочу, чтобы получить corret value

так я искать слово ad с последующим </div> тогда любая вещь до другого <div> затем получить все значения до </div>

Я использую этот код:

re.findall(r'ad</div>.*<div>(.*)</div>',x,re.S) 

Я использую falg re.S, потому что хочу, чтобы точка соответствовала новой строке. Я не знаю, сколько строк между div. поэтому я использую. *!

Я думаю, что findall должен вернуть correct value, но он возвращает wrong value. Зачем ? он ищет последний div, а не первый?

+0

Пожалуйста, прочитайте это: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags#answer-1732454 –

+0

@DanielRoseman, так что я не должен» t пользователь regex разобрать html, что вы предлагаете? – david

+0

HTML-парсер. BeautifulSoup - хороший. –

ответ

2

, потому что у вас есть жадный

попробовать ленивых:

re.findall(r'ad</div>.*?<div>(.*?)</div>',x,re.S) 

В вашем примере .* на самом деле соответствие все ближе к концу, а затем он видит <div>, то ваша спина регулярных выражений дорожек и и снова начинается сопоставление, аналогично второму сценарию,

демо здесь:

http://regex101.com/r/zY9xA3/1

+1

@ downvoter: ваш нисходящий символ ничего не значит, если вы не добавите комментарий вместе с ним. – aelor

+0

благодарим вас за ответ, но какая разница между ними. *? и. * – david

+1

'. *?' будет соответствовать минимальным символам, а '. *' будет выполнять максимальное совпадение. пример 'a. * b' будет полностью соответствовать' aabbcccddb', тогда как 'a. *? b' будет соответствовать только до первого b i.e' aab' – aelor

0

Если вы хотите, чтобы найти вещь между 2 специальной строки, используйте Lookahead and Lookbehind Assertions:

>>> re.findall(r'(?<=\<div\>)[\w ]+(?=\<\/div\>)',x) 
['ad', ' correct value ', ' wrong value '] 
>>> re.findall(r'(?<=\<div\>)[\w ]+(?=\<\/div\>)',x)[1].strip() 
'correct value' 
0

Через инструмент, который специально используется для разбора HTML-файлов.

>>> from bs4 import BeautifulSoup 
>>> x=""" <div>ad</div> \n\n <div> correct value </div> <div> wrong value </div> """ 
>>> soup = BeautifulSoup(x) 
>>> for i, x in enumerate(soup.find_all('div')): 
    if x.string == 'ad': 
     count = count + i + 1 


>>> count 
1 
>>> soup.find_all('div')[count].string 
' correct value ' 
>>> soup.find_all('div')[count].string.strip() 
'correct value' 
Смежные вопросы