正则表达式从HTML中提取名称

时间:2013-08-13 21:14:47

标签: python regex

我有两段代码,我想从中提取名称。

代码:

 ;"><strong>DeanSkyShadow</strong>
 ;"><strong><em>Xavier</em></strong>

正则表达式应该提取名称​​ DeanSkyShadow Xavier 。我现在的正则表达式:

(?<=(;"><strong><em>)|(;"><strong>))[\s\S]+?(?=(</em></strong>)|(</strong>))
如果代码中没有em标签,

正确地抓取名称;如果有,那么它也会抓取开放的em标记,如下所示:<em>Xavier。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

匹配 <个字符的所有内容;你也不能使用可变宽度的后视,所以你的版本根本不起作用。使用非捕获模式

(?:;"><strong>(?:<em>)?)([^<]+?)(?=(?:</em>)?</strong>)

演示:

>>> import re
>>> sample = '''\
...  ;"><strong>DeanSkyShadow</strong>
...  ;"><strong><em>Xavier</em></strong>
... '''
>>> re.findall(r'(?:;"><strong>(?:<em>)?)([^<]+?)(?=(?:</em>)?</strong>)', sample)
['DeanSkyShadow', 'Xavier']

更好的解决方案是使用HTML解析器。我可以推荐BeautifulSoup

from bs4 import BeautifulSoup

soup = BeautifulSoup(htmltext)

for strong in soup.find_all('strong'):
    print strong.text