2014-11-10 1 views
1

여기 내 코드입니다 : 내가 실행할 때, 지금내 정규식 테스터에 일을 "표시",하지만 내 실제 코드에

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

:

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는 다음 문자열로 확인 이 Pythex에서, 그것은 내가하고 싶은 것인 "p2", "p8""p1"과 일치합니다. 그러나 python3의 정규식 인터프리터에서 실행할 때 "p2" 만 일치합니다. 나는 무엇을 여기에서 엉망 이냐?

답변

2

re.search은 일치하는 첫 번째 인스턴스를 검색하여 이깁니다. 모든 일치를 제공합니다.

모든 일치 항목을 얻으려면 대신 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'] 
+0

이 방법이 유용했습니다. 고맙습니다! 나는 정규 표현식을 처음 사용하기 때문에 findall 메소드를 인식하지 못했습니다. 정말 고맙습니다! – crashfocus

+0

@crashfocus 그런 다음 동의하고 upvote 것을 잊지 마세요 :) –

1

게다가, 당신은 BeautifulSoup 일을 할 수 있도록하고 (하나 개 이상의 숫자 뒤에 p) p\d+ 정규 표현식과 일치하는 클래스가 모든 div의 찾을 수 있습니다

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+'))