如何获得第一次出现?正则表达式python

时间:2014-11-27 12:06:06

标签: python regex python-2.7

我有这个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?

4 个答案:

答案 0 :(得分:3)

因为你拥有的是贪心

试试懒惰:

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

在您的示例中.*实际上是将所有内容匹配到最后,然后它会看到<div>,然后您的正则表达式返回跟踪并再次开始匹配,类似于第二种情况,

演示:

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

答案 1 :(得分: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'

答案 2 :(得分:0)

ad</div>((?!<div>).)*<div>(((?!<\/div>).)*)</div>

你可以试试这个。参见演示。

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

答案 3 :(得分: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'