2013-06-01 2 views
1

내가 정규식을 만들어 작동 "http://something" 또는 https://something.의 형태로 웹 페이지의 모든 링크를 찾을려고 :파이썬 정규식 교대

L = re.findall(r"http://[^/\"]+/|https://[^/\"]+/", site_str) 

그러나,이 쓰는 짧은 방법이? 나는 반복 해요 : // [^/\ "] +/두 번, 나는 여러 가지 물건을 시도했지만 작동하지 않습니다 아마 필요없이 내가 시도 :..

L = re.findall(r"http|https(://[^/\"]+/)", site_str) 
L = re.findall(r"(http|https)://[^/\"]+/", site_str) 
L = re.findall(r"(http|https)(://[^/\"]+/)", site_str) 

그것은 내가 부족 분명 여기 뭔가 또는 난 그냥 파이썬 정규식을 이해하지 못합니다.

답변

10

당신은 캡처 그룹을 사용하고 있으며, .findall() alters behaviour when you use those (캡처 그룹의 내용 만 반환합니다.) 정규 표현식을 단순화 할 수 있지만 다음과 같은 경우 버전이 작동합니다. 대신 - 캡쳐 그룹을 사용하십시오.

당신은 당신이 표현의 주위에 작은 따옴표를 사용하는 경우 큰 따옴표를 이스케이프 할 필요가 없습니다, 당신은 단지 표현의 s을 변경할 필요가 있기 (위해) 때문에, s?도 작동합니다 :

L = re.findall(r'https?://[^/"]+/', site_str) 

데모 :

>>> import re 
>>> example = ''' 
... "http://someserver.com/" 
... "https://anotherserver.com/with/path" 
... ''' 
>>> re.findall(r'https?://[^/"]+/', example) 
['http://someserver.com/', 'https://anotherserver.com/'] 
+0

'*'마크가 '(https)'인 것처럼 느껴집니다 ... 새로운 것을 배웠습니다. – Elazar

+0

@Elazar : 그것은 앞의 원자에 적용됩니다. 물음표가 하나의 문자 이상에 적용되도록 전체 'https'부분을 그룹화해야합니다. '?'는'*'와 같은 범위를가집니다. –

+0

멋진 답변. 고맙습니다. 나는 그룹을 붙잡는 것에 대해서도 몰랐다. – darxsys