【问题标题】:Extract sub path from url with regex使用正则表达式从 url 中提取子路径
【发布时间】:2016-10-08 07:25:35
【问题描述】:

我有这个网址:

 http://www.example.com/en/news/2016/07/17/1207151/%D9%81%D8%AA%D9%88%D8%A7%DB%8C-%D8%B1%D9%87%D8%A8%D8%B1-

我要在这里提取1207151

这是我的正则表达式:

pattern = '(http[s]?:\/\/)?([^\/\s]+\/)+[^/]+[^/]+[^/]+[^/]/(?<field1>[^/]+)/'

但这是错误的!

我的错误是什么?

【问题讨论】:

  • 你想要的部分总是在罚款/之前的最后一个吗?
  • @Syntac 我想得到17/之前和/%D9...之后的数字,正好是1207151

标签: python regex url


【解决方案1】:

您可以在 python 代码中使用这个正则表达式:

>>> url = 'http://www.example.com/en/news/2016/07/17/1207151/%D9%81%D8%AA%D9%88%D8%A7%DB%8C-%D8%B1%D9%87%D8%A8%D8%B1-'
>>> re.search(r'^https?://(?:([^/]+)/){7}', url).group(1)
'1207151'

([^/]+)/){7} 将匹配 1 个或多个非正斜杠和 / 7 次,为我们提供捕获的第 1 组中的最后一个匹配项。

【讨论】:

    【解决方案2】:

    你有几件事要发生。

    首先,您需要正确转义您的所有/s。您拥有其中的大部分,但错过了一些:

    (http[s]?:\/\/)?([^\/\s]+\/)+[^\/]+[^\/]+[^\/]+[^\/]\/(?<field1>[^\/]+)\/
    

    从这里开始,你可以减少一行中的“1个或多个非/”:

    [^\/]+[^\/]+[^\/]+ ==> [^\/]{3,}
    

    但这不是你的意思,你的意思是有很多“非/”块,后面跟着一个“/”,根据你的例子,在使用你命名的捕获组之前,你想要它 6 次。

    ([^\/]+\/){6}
    

    以下是有效的:

    http[s]?:\/\/([^\/]+\/){6}(?<field1>[^\/]+)\/
    

    您可以在这里看到它的实际效果:https://regex101.com/r/kkqwRJ/2

    【讨论】:

      【解决方案3】:
      import re
      print re.search(r'.*/([^/]+)/.*',s).group(1)
      

      【讨论】:

      • 您能描述一下您对输入字符串所做的假设吗?
      • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 2021-07-29
      相关资源
      最近更新 更多