2016-12-13 1 views
0

나는 ID 번호를 가져 오려고하는 URL 목록이 있습니다. URLParse와 정규 표현식의 조합을 사용하여이 문제를 해결하려고합니다.파이썬에서 URL이 포함 된 정규 표현식이 일치합니다.

def url_cleanup(url): 
    parsed_url = urlparse(url) 
    if parsed_url.query=="fref=ts": 
     return 'https://www.facebook.com/'+re.sub('/', '', parsed_url.path) 
    else: 
     qry = parsed_url.query 
     result = re.search('id=(.*)&fref=ts',qry) 
     return 'https://www.facebook.com/'+result.group(1) 

는 그러나, 나는 정규 표현식 result = re.search('id=(.*)&fref=ts',qry)은 아래의 예에 설명 된대로 URL 중 일부 일치하지 느낌 : 여기처럼 내 함수가 모습입니다.

#1 
id=10001332443221607 #No match 

#2 
id=6383662222426&fref=ts #matched 

는 다시 # 2하지만 위의 예에서하지 # 1 일치 id=(.*).+?(?=&fref=ts)로 내 정규 표현식의 문구를 수정하여 this 대답에서 제공되는 제안에 따라 제안을 찍어 보았습니다.

여기에 무엇이 누락되어 있는지 잘 모르겠습니다. 모든 제안/힌트를 주시면 감사하겠습니다.

+0

를 참조하십시오, 그들은 패턴 공예에 매우 편리합니다. https://regex101.com/은 하나입니다. 패턴에 대해''id = (\ d *) ''를 시도 했습니까? – wwii

답변

2

귀하의 정규식의 참 잘못이다.

id=(.*)&fref=ts 표현식을 사용하면 &fref=ts 문자로만 대치됩니다.

id=(.*).+?(?=&fref=ts)을 사용하면 동일한 작업을 수행하지만 비 캡처 그룹 표현 인 lookahead를 사용하게됩니다. 즉, 일치 항목은 id=blablabla 부분 일 뿐이며 &fref=ts으로 해결해야합니다.

또한 id=(.*)은 숫자, 문자, 기호로 구성된 ID와 문자 그대로 일치합니다. id=\d+을 사용하면 '숫자 전용'ID와 일치합니다.

그래서, 당신의 ID를 항상 (괄호를 사용하여) 숫자 및 캡처 나중에 사용하기 위해 단지이 자리입니다 여겨

result = re.search('id=(\d+)', qry) 

는 당신이 단지 숫자를 잡을 수 사용해보십시오.

더 참고로, 파이썬의 풍미를 사용하는 몇 가지 온라인 정규식 테스터가 있습니다 http://www.regular-expressions.info/python.html

1

정규식을 약간 조정해야합니다. 시도 :

result = re.search('id=(\d+)(&fref=ts)?', qry) 

id=(\d+)id= 다음 자리의 번호와 일치하고, (&fref=ts)?는 문자의 다음 그룹이 선택 될 수 있습니다. 필요한 경우 다시 추가 할 수 있습니다.

또한 일치하는 항목이없는 경우이 오류가 발생되므로주의해야한다 - 그래서 당신은 약간 변경할 수 있습니다 :

result = re.search('id=(\d+)(&fref=ts)?', qry) 
if result: 
    return 'https://www.facebook.com/'+result.group(1) 
else: 
    # some error catch 
관련 문제