【问题标题】:Regex to extra part of the url正则表达式到 URL 的额外部分
【发布时间】:2016-03-09 15:31:21
【问题描述】:

我正在尝试使用正则表达式提取部分网址。我正在尝试对两种 url 类型在一行和一个单词中理想地做到这一点。 我正在尝试以下但不知道我应该如何获得第二个网址。我正在尝试从两者中提取 4FHP。

>>> import re
>>>
>>> a="/url_redirect/4FHP"
>>> b="/url/4FHP/asdfasdfas/"
>>>
>>> re.search('^\/(url_redirect|url)\/(.*)', a).group(2)
'4FHP'
>>> re.search('^\/(url_redirect|url)\/(.*)', b).group(2)
'4FHP/asdfasdfas/'

【问题讨论】:

  • 究竟要匹配什么。您是否只是想查看“4FHP”是否存在并在存在时接受它?还是您在 URL 内的某个位置寻找“某物”?
  • Lennard,如您所知,SO 是一个问答网站。你的问题到底是什么?
  • 我的问题是“我正在尝试从两者中提取 4FHP。”抱歉,我认为这很清楚?
  • 这实际上不是一个问题。那是一个声明。不,我根本不清楚你在问什么。有关提出好问题的更多信息,请参阅How to Ask,尤其是minimal reproducible example
  • @Robᵩ 感谢您的回答,但有时最好不要这么无知。对不起,我的书面英语不如你。

标签: python regex


【解决方案1】:

以下代码将从任一字符串中提取4FHP。注意到我将.*(匹配任何非换行符的序列)更改为[^/]*(匹配任何非/字符的序列)。

re.search('^\/(url_redirect|url)\/([^/]*)', b).group(2)

【讨论】:

    【解决方案2】:

    您的问题是 * 运算符是“贪婪”的,因此它会抓取到字符串的末尾,这就是您在第二个示例中得到 '4FHP/asdfasdfas/' 的原因

    当你看到另一个/时你需要停止匹配,最简单的方法是使用一个专门排除它的字符类,例如[^/]

    您也可以使用非捕获组(?: <regex> ) 仅返回您感兴趣的匹配组

    re.search('^\/(?:url_redirect|url)\/([^/]*)', b).group(1)
    

    【讨论】:

    • 感谢您的解释。这很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 2014-09-04
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 2018-08-18
    相关资源
    最近更新 更多