2016-12-13 9 views
0

私はID番号だけを取得しようとしているURLのリストを持っています。私はURLParseと正規表現の組み合わせを使ってこれを解決しようとしています。ここに私の関数がどのように見えるかです:URLを含むPythonの正規表現に一致する

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/は1つです。パターンに対して '' id =(\ d *) ''を試しましたか? – wwii

答えて

2

あなたの正規表現のは確かに、間違っています。

id=(.*)&fref=tsの式を使用すると、&fref=tsという文字列が文字通り一致します。

あなたが同じことを行いますid=(.*).+?(?=&fref=ts)を使用しますが、非キャプチャグループ式で先読みを使用して。つまり、あなたの試合はid=blablabla部分のみになりますが、それは&fref=tsで解決された場合のみです。

また、id=(.*)は数字、文字、記号...文字通り何で構成されるIDと一致します。 id=\d+を使用すると、「数字のみ」のIDと一致します。だから、

、それはあなたのIDを想定し、あなただけの数字をキャッチすることができます

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

を使用してみてください常に数字であり、(括弧を使用して)捕獲後の使用のためにのみこれらの数字。さらに参考のために

は、Pythonの味を使用し、いくつかのオンライン正規表現テスターはあり 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 
関連する問題