2013-07-01 5 views
9

패턴의 인스턴스를 여러 개 가질 수있는 문자열과 패턴을 일치 시키려고합니다. 모든 인스턴스를 별도로 필요로합니다. re.findall()해야합니까하지만 내가 뭘 잘못하고 있는지 모르겠어요.여러 번 일치하는 파이썬 정규식

pattern = re.compile('/review: (http://url.com/(\d+)\s?)+/', re.IGNORECASE) 
match = pattern.findall('this is the message. review: http://url.com/123 http://url.com/456') 

나는 'http://url.com/123', http://url.com/456 필요하고 두 숫자는 123 & 456 match 목록의 다른 요소가 될 수 있습니다.

패턴으로도 '/review: ((http://url.com/(\d+)\s?)+)/'을 시도했지만 행운이 없습니다.

+0

을 제공합니다 : 두 번째 HTTP와 같은 부분이 그 전에이 없습니다. – abc123

+0

네,하지만 거기에는 그것이 필요합니다, 그것은 정규 표현식의 일부입니다. 거기에 어떤 URL도 필요하지 않습니다. 단지 'review :'문자열 인 ' – mavili

답변

12

사용하십시오. 원하는 결과를 얻으려면 캡처 그룹 외부에 '리뷰'를 배치해야합니다.

pattern = re.compile(r'(?:review:)?(http://url.com/(\d+))\s?', re.IGNORECASE) 

이 그냥 검토를 제거 출력을

>>> match = pattern.findall('this is the message. review: http://url.com/123 http://url.com/456') 
>>> match 
[('http://url.com/123', '123'), ('http://url.com/456', '456')] 
+0

'을 따르는 것뿐입니다. 감사합니다! '? (review : review) '뒤에 나오는'?'도 중요하지 않습니다. 왜냐하면 나없이 모든 일치를 제공하지 않기 때문입니다. ;) – mavili

+0

'가져 오기'를 잊지 마세요. – Rambatino

5

당신은 여분의/정규식에 있어요. 파이썬에서 패턴은 단지 문자열이어야합니다. 예 : 이 대신에 :

pattern = re.compile('/review: (http://url.com/(\d+)\s?)+/', re.IGNORECASE) 

그것은해야한다 : 또한

pattern = re.compile('review: (http://url.com/(\d+)\s?)+', re.IGNORECASE) 

일반적으로 파이썬에서 실제로이 같은 "원시"문자열을 사용하십시오 :에

pattern = re.compile(r'review: (http://url.com/(\d+)\s?)+', re.IGNORECASE) 

여분의 연구를 문자열의 앞부분은 많은 백 슬래시를 피할 필요가 없게합니다.

0

두 단계 접근법을 사용하십시오. 먼저 everythin g : "review :"에서 EOL로 이동 한 다음 토큰 화합니다.

msg = 'this is the message. review: http://url.com/123 http://url.com/456' 

review_pattern = re.compile('.*review: (.*)$') 
urls = review_pattern.findall(msg)[0] 

url_pattern = re.compile("(http://url.com/(\d+))") 
url_pattern.findall(urls) 
관련 문제