为什么只匹配最后一个事件?

2024-05-16 10:39:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下字符串:

s = '''
    <a class="biz-name"><span>Gus’s World Famous Fried Chicken</span></a>
    <a class="biz-name"><span>South City Kitchen - Midtown</span></a>
'''

我试图在<span>之间匹配这两个组

使用以下

regex = re.compile('<a class="biz-name[\w\W]*<span>(.*)</span>')
regex.findall(s)

期望值:

['Gus’s World Famous Fried Chicken', 'South City Kitchen - Midtown']

实际

['South City Kitchen - Midtown']

为什么只匹配最后一个事件?你知道吗


Tags: 字符串namecityworldclassregexspansouth
2条回答

You shouldn't parse xml with regex。也就是说,regex的greedyness让你,[\w\W]*几乎匹配任何东西,所以它会吃掉第一个表达式。你知道吗

添加一个非贪婪的?标记([\w\W]*?)修复了这个问题。在小组里加一个也没什么坏处。我已经用.*?替换了[\w\W]*?,因为它更简单、更等价。你知道吗

regex = re.compile('<a class="biz-name.*?<span>(.*?)</span>')

regex101上看到这个。你知道吗

正则表达式通常不是最好的清除HTML的方法。例如,另一种方法是使用BeautifulSoup

from bs4 import BeautifulSoup
s = '''
<a class="biz-name"><span>Gus’s World Famous Fried Chicken</span></a>
<a class="biz-name"><span>South City Kitchen - Midtown</span></a>
'''
s = BeautifulSoup(s, 'lxml')
results = [i.text for i in s.find_all('span')]

输出:

[u'Gus’s World Famous Fried Chicken', u'South City Kitchen - Midtown']

但是,一个简单的正则表达式解决方案:

import re
s = '''
 <a class="biz-name"><span>Gus’s World Famous Fried Chicken</span></a>
 <a class="biz-name"><span>South City Kitchen - Midtown</span></a>
'''
final_results = re.findall('<span>(.*?)</span>', s)

输出:

['Gus’s World Famous Fried Chicken', 'South City Kitchen - Midtown']

相关问题 更多 >