0

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

代码:

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

正则表达式应提取名称DeanSkyShadowXavier。我目前的正则表达式:

(?<=(;"><strong><em>)|(;"><strong>))[\s\S]+?(?=(</em></strong>)|(</strong>))

如果代码中没有 em 标签,则正确抓取名称;如果有,那么它也会抓住开始的 em 标签,像这样:<em>Xavier。我该如何解决?

4

1 回答 1

3

匹配任何不是<字符的东西;你也不能使用可变宽度的look-behind,所以你的版本根本不起作用。改用非捕获模式

(?:;"><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
于 2013-08-13T21:18:22.803 回答