在包含URL的python中匹配正则表达式

在包含URL的python中匹配正则表达式,python,regex,url,Python,Regex,Url,我有一个URL列表,我正试图从中获取id号。我正试图使用URLParse和正则表达式的组合来解决这个问题。下面是我的函数的外观: 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: qr

我有一个URL列表,我正试图从中获取id号。我正试图使用URLParse和正则表达式的组合来解决这个问题。下面是我的函数的外观:

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
我试图根据答案中提供的建议采纳该建议,将我的正则表达式重新表述为
id=(.*)。+?(?=&fref=ts)
,它再次匹配上述示例中的#2而不是#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

你的正则表达式需要稍微调整一下。尝试:

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

你的正则表达式确实是错的

使用表达式
id=(.*)&fref=ts
,您将只按字面意思匹配以
&fref=ts
开头的id

使用
id=(.*)。+?(?=&fref=ts)
可以做同样的事情,但是使用lookahead,这是一个非捕获组表达式。这意味着您的匹配将仅是
id=blablabla
部分,但前提是它被
&fref=ts
取代

此外,
id=(.*)
将匹配由数字、字母、符号组成的id。。。随便什么。使用
id=\d+
将匹配“仅限数字”id

所以,尝试使用

result = re.search('id=(\d+)', qry)
假设您的ID始终是数字,它将允许您仅捕获数字,并仅捕获(使用括号)这些数字供以后使用

有关更多参考,请参阅
你的正则表达式确实是错的

使用表达式
id=(.*)&fref=ts
,您将只按字面意思匹配以
&fref=ts
开头的id

使用
id=(.*)。+?(?=&fref=ts)
可以做同样的事情,但是使用lookahead,这是一个非捕获组表达式。这意味着您的匹配将仅是
id=blablabla
部分,但前提是它被
&fref=ts
取代

此外,
id=(.*)
将匹配由数字、字母、符号组成的id。。。随便什么。使用
id=\d+
将匹配“仅限数字”id

所以,尝试使用

result = re.search('id=(\d+)', qry)
假设您的ID始终是数字,它将允许您仅捕获数字,并仅捕获(使用括号)这些数字供以后使用

有关更多参考,请参阅

有一些在线正则表达式测试人员使用Python风格,他们非常方便地制作模式。这是一个。您是否尝试过模式的
'id=(\d*)'
?有一些使用Python风格的在线正则表达式测试人员,他们非常方便创建模式。这是一个。您是否尝试了模式的
'id=(\d*)'