我有两段代码,我想从中提取名称。
代码:
;"><strong>DeanSkyShadow</strong>
;"><strong><em>Xavier</em></strong>
正则表达式应该提取名称 DeanSkyShadow 和 Xavier 。我现在的正则表达式:
(?<=(;"><strong><em>)|(;"><strong>))[\s\S]+?(?=(</em></strong>)|(</strong>))
如果代码中没有em标签,正确地抓取名称;如果有,那么它也会抓取开放的em标记,如下所示:<em>Xavier
。我该如何解决这个问题?
答案 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