【问题标题】:What am i doing wrong with this regular expression我对这个正则表达式做错了什么
【发布时间】:2013-11-27 16:53:14
【问题描述】:
links = re.findall('href="(http(s?)://[^"]+)"',page)

我有这个正则表达式来查找网站中的所有链接,我得到了这个结果:

('http://asecuritysite.com', '')
('https://www.sans.org/webcasts/archive/2013', 's')

当我想要的只是这个:

http://asecuritysite.com
https://www.sans.org/webcasts/archive/2013

如果我在 href 之后删除 "(,它会给我带来很多错误,有人可以解释原因吗?

【问题讨论】:

  • 如果你只删除一个括号,你最终会得到不平衡的括号(用于表示捕获组),这是一个语法错误(排序)。为什么要删除那个括号?

标签: python regex


【解决方案1】:

如果您使用超过 1 个捕获组,re.findall 返回元组列表而不是字符串列表。尝试以下(仅使用单个组):

>>> import re
>>> page = '''
...     <a href="http://asecuritysite.com">here</a>
...     <a href="https://www.sans.org/webcasts/archive/2013">there</a>
...     '''
>>> re.findall(r'href="(https?:\/\/[^"]+)"',page)
['http://asecuritysite.com', 'https://www.sans.org/webcasts/archive/2013']

根据re.findall documentation:

如果模式中存在一个或多个组,则返回一个列表 团体;如果模式有多个,这将是一个 元组列表 组。

【讨论】:

    【解决方案2】:

    尝试摆脱第二组(原始模式中的(s?)):

    links = re.findall('href="(https?:\/\/[^"]+)"',page)
    

    【讨论】:

    • @user2988983 falsetru 提供了一个excellent explanation。基本上,使用多个捕获组会导致结果以这种方式格式化。
    【解决方案3】:

    你做错了什么是试图用正则表达式解析 HTML。而那位先生,是罪孽。

    See here for the horrors of Regex parsing HTML

    另一种方法是使用类似lxml 的东西来解析页面并提取类似这样的链接

    urls = html.xpath('//a/@href')
    

    【讨论】:

    • 实际上(该链接中的许多 cmets 也指出)OP 不是解析 HTML,而是简单地搜索与模式匹配的字符串。
    • 我没有看到任何证据表明他没有尝试解析 html
    • @iamnotmaynard 特别可怕,因为他正在正则表达式搜索page 变量。
    【解决方案4】:

    如果https? 之前是单引号而不是双引号,您也会遇到问题。

    (https?:\/\/[^\"\'\&gt;]+) 将捕获整个字符串;然后你可以做的是在它前面加上(href=.?),你最终会得到两个捕获组:

    完整的正则表达式:(href=.?)(https?:\/\/[^\"\'\&gt;]+)

    第 1 场

    • [第 1 组]href='
    • [第 2 组]http://asecuritysite.com

    第 2 场

    • [第 1 组]href='
    • [第 2 组]https://www.sans.org/webcasts/archive/2013

    http://regex101.com/r/gO8vV7 这是一个工作示例

    【讨论】:

    • 不要忘记禁止白色字符(不能在 href 属性中)
    • @CasimiretHippolyte 最好不要这样做,以免原始程序员输入非法字符。只要后面没有引号或&gt; 分隔符,就会被捕获。
    • 为什么不这样做,但如果你有其他属性之后这不起作用。
    猜你喜欢
    • 2010-12-17
    • 1970-01-01
    • 2022-07-27
    • 2016-04-04
    • 2011-10-24
    • 2012-11-19
    • 1970-01-01
    相关资源
    最近更新 更多