【问题标题】:matching regular expressions in python which contains URLs匹配包含URL的python中的正则表达式
【发布时间】:2016-12-13 16:08:19
【问题描述】:

我有一个 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

我尝试按照this 答案中提供的建议采纳建议,将我的正则表达式改写为id=(.*).+?(?=&fref=ts),在上面的示例中再次匹配#2 但不匹配#1。

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

【问题讨论】:

  • 有一些使用 Python 风格的在线正则表达式测试器,它们非常方便地制作模式。 regex101.com 是其中之一。您是否尝试过 'id=(\d*)' 的模式?

标签: python regex url


【解决方案1】:

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

使用表达式id=(.*)&fref=ts,您只会匹配以&fref=ts 为后继的ID。

使用id=(.*).+?(?=&fref=ts) 你会做同样的事情,但使用前瞻,这是一个非捕获组表达式。这意味着您的匹配将只是id=blablabla 部分,但前提是它由&fref=ts 接替。

此外,id=(.*) 将匹配由数字、字母、符号组成的 id ......几乎任何东西。使用 id=\d+ 将匹配“仅限数字”的 ID。

所以,尝试使用

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

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

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

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-04
      • 2015-09-14
      • 2021-12-31
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多