我的正则表达式"出现"在测试人员中工作,但不在我的实际代码中

时间:2014-11-10 03:31:47

标签: python regex beautifulsoup python-3.4

这是我的代码:

gasprices = requests.get("insert url here")

soup = BeautifulSoup(gasprices.content)
price1 = soup.find("div", class_="sp_p")

price1list = re.search('(p[0-9])', str(price1))

price1解析为以下字符串:

< div class="sp_p">< div class="p2"></div>< div class="pd"></div>< div class="p8"></div>< div class="p1"></div></div>

现在,当我在Pythex中运行时,它会匹配"p2""p8""p1"这就是我想要的。但是,当我在python3的正则表达式解释器中运行它时,它只匹配"p2"。我在这里搞砸了什么?

2 个答案:

答案 0 :(得分:2)

re.search将搜索匹配的第一个实例,因此它赢了; t给你所有的匹配。

相反,请使用re.findall(pattern, string)获取所有匹配项。

>>> import re
>>> string = """< div class="sp_p">< div class="p2"></div>< div class="pd"></div>< div class="p8"></div>< div class="p1"></div></div>"""
>>> re.search('(p[0-9])', string)
<_sre.SRE_Match object at 0x7fdefc9ee558>
>>> re.findall('(p[0-9])', string)
['p2', 'p8', 'p1']

答案 1 :(得分:1)

此外,您可以让BeautifulSoup完成工作,找到所有div个匹配p\d+正则表达式(p后跟一个或多个数字)的类:

import re
from bs4 import BeautifulSoup

data = """
<div class="sp_p"><div class="p2"></div><div class="pd"></div><div class="p8"></div><div class="p1"></div></div>
"""

soup = BeautifulSoup(data)
print soup.find_all('div', class_=re.compile(r'p\d+'))

打印:

[<div class="p2"></div>, <div class="p8"></div>, <div class="p1"></div>]

在您的情况下,用法是:

price1.find_all('div', class_=re.compile(r'p\d+'))