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

时间:2016-12-13 16:08:19

标签: python regex url

我有一个URLS列表,我试图从中获取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

我尝试按照this回答中提供的建议,将我的正则表达式改为id=(.*).+?(?=&fref=ts),并再次匹配#2而不是上述示例中的#1。

我不确定我在这里缺少什么。任何建议/提示将不胜感激。

2 个答案:

答案 0 :(得分:2)

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

使用表达式var mammoth = require("mammoth"); mammoth.convertToHtml({path: "path/to/document.docx"}) .then(function(result){ var html = result.value; // The generated HTML var messages = result.messages; // Any messages, such as warnings during conversion }) .done(); ,您只会匹配id=(.*)&fref=ts字面上成功的ID。

使用&fref=ts您将执行相同的操作,但使用前瞻,这是一个非捕获组表达式。这意味着您的匹配只会是id=(.*).+?(?=&fref=ts)部分,但前提是id=blablabla成功。

此外,&fref=ts将匹配由数字,字母,符号组成的ID ......几乎任何东西。使用id=(.*)将匹配'仅限数字'ID。

所以,尝试使用

id=\d+

它将允许您仅捕获数字,假设您的ID始终为数字,并且仅捕获(使用括号)这些数字供以后使用。

有关进一步参考,请参阅 http://www.regular-expressions.info/python.html

答案 1 :(得分: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