2016-12-13 65 views
0

我有一個URLS列表,我試圖從中獲取只是身份證號碼。我正在嘗試使用URLParse和正則表達式的組合來解決這個問題。這裏是我的功能看起來像:在Python中匹配正則表達式,其中包含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)不匹配的一些網址,如下面的例子說明。

#1 
id=10001332443221607 #No match 

#2 
id=6383662222426&fref=ts #matched 

我試圖通過改寫我的正則表達式作爲id=(.*).+?(?=&fref=ts)這再次匹配#2,但在上述實施例不#1採取建議按照在this回答所提供的建議。

我不知道我在這裏錯過了什麼。任何建議/提示將不勝感激。

+0

有跡象表明,使用Python的風味幾個網上正則表達式測試儀,它們是手工製作的圖案非常方便。 https://regex101.com/是一個。你有沒有試過''id =(\ d *)''爲模式? – wwii

回答

2

你的正則表達式的是錯的,確實如此。

使用表達式id=(.*)&fref=ts字面上,您將只匹配由&fref=ts繼承的ID。

使用id=(.*).+?(?=&fref=ts)你會做同樣的事情,但使用lookahead,這是一個非捕獲組表達式。這意味着你的匹配只會是id=blablabla部分,但只有在&fref=ts之後。

此外,id=(.*)將匹配包含數字,字母,符號......的字面意義上的任何事物。使用id=\d+將匹配「僅限數字」ID。

所以,儘量使用

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

它可以讓你趕上只是數字,假設您的ID始終是數字,捕獲(使用括號),只有這些數字供以後使用。

更多參考,請參閱 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 
相關問題