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

2024-05-17 12:32:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个网址列表,我正试图从中获取只是身份证号码。我正在尝试使用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

我试图按照this答案中提供的建议来接受这个建议,将我的正则表达式重新表述为id=(.*).+?(?=&fref=ts),它在上面的示例中再次匹配#2而不是#1。你知道吗

我不知道我在这里错过了什么。任何建议/暗示都将不胜感激。你知道吗


Tags: httpsrecomidurlfacebookreturnwww
2条回答

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

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始终是数字,并且仅捕获(使用括号)这些数字以供以后使用。你知道吗

有关更多参考,请参阅 http://www.regular-expressions.info/python.html

相关问题 更多 >