【问题标题】:excluding characters in \S regex match排除 \S 正则表达式匹配中的字符
【发布时间】:2010-09-22 11:21:00
【问题描述】:

我有以下正则表达式来匹配 html 链接:

<a\s*href=['|"](http:\/\/(.*?)\S['|"]>

它有点工作。除了不是真的。因为它会在

编辑: 这将使它只抓取引号而不是 之后的所有内容

【问题讨论】:

  • 了解它实际试图实现的目标会有所帮助...
  • 顺便说一句,这个正则表达式甚至不会编译:不平衡括号
  • 这不起作用:引号应该匹配。以单引号作为分隔符的属性可以包含双引号。另外,您不满足其他属性(如“标题”)或相对路径或 http 以外的其他协议。
  • 你在正则表达式中有不平衡的括号——它可以编译吗?您是否需要使用反向引用 '\1' 来获得匹配的报价?

标签: python html regex


【解决方案1】:

您为什么要尝试使用正则表达式匹配 HTML 链接?

根据您尝试做的适当的事情会有所不同。

您可以尝试使用 HTML 解析器。有几个可用的,Python 库中甚至还有一个:https://docs.python.org/library/htmlparser.html

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    我遇到了一些网址中的单引号问题,例如 Fox Sports 的这个。我做了一些我认为应该照顾它的轻微调整。

    http://msn.foxsports.com/mlb/story/9152594/Fehr:'Heightened'-concern-about-free-agent-market

    /\s]/i

    这要求右引号后跟一个空格或右括号。

    【讨论】:

      【解决方案3】:

      阅读 Jeff Friedl 的“掌握正则表达式”一书。

      如书面:

      <a\s*href=['|"](http:\/\/(.*?)\S['|"]>
      

      表达式中有不平衡的括号。也许问题在于第一场比赛被视为“读到正则表达式的结尾”。另外,为什么不希望 URL 的最后一个非空格字符?

      .*? (懒惰的贪婪)运算符很有趣。不过,我必须说,我更倾向于写作:

      <a\s+href=['|"]http://([^'"><]+)\1>
      

      这区分了“

      【讨论】:

        【解决方案4】:
        >>> import re
        >>> regex = '<a\s+href=["\'](http://(.*?))["\']>'
        >>> string = '<a href="http://google.com/test/this">'
        >>> match = re.search(regex, string)
        >>> match.group(1)
        'http://google.com/test/this'
        >>> match.group(2)
        'google.com/test/this'
        

        解释:

         \s+   = match at least one white space (<ahref) is a bad link
         ["\'] = character class, | has no meaning within square brackets
                 (it will match a literal pipe "|")
        

        【讨论】:

          【解决方案5】:

          \S 匹配任何不是空白字符的字符,就像 [^\s]

          这样写,你可以很容易地排除引号:[^\s"']

          请注意,您可能必须提供 .*?在您的正则表达式中进行相同的处理。点匹配任何不是换行符的字符,就像 [^\r\n]

          再一次,这样写,你可以很容易地排除引号:[^\r\n'"]

          【讨论】:

            【解决方案6】:

            我不认为你的正则表达式正在做你想做的事。

            <a\s*href=['|"](http:\/\/(.*?)\S['|"]>
            

            这会非贪婪地捕获从 http:// 到引号、单引号或管道之前的第一个非空格字符的任何内容。就此而言,我不确定它是如何解析的,因为它似乎没有足够的近括号。

            如果您尝试捕获 href,您可以尝试以下操作:

            <a .*?+href=['"](http:\/\/.*?)['"].*?>
            

            这使用 .*? (非贪婪匹配任何东西)以允许其他属性(目标、标题等)。它匹配一个以单引号或双引号开头和结尾的 href(它不区分,并允许 href 以一个开头并以另一个结尾)。

            【讨论】:

            • 显示的所有正则表达式都匹配不匹配的单引号/双引号(问题和答案)。您必须捕获打开的引用并在 \1 反向引用中再次使用它。
            猜你喜欢
            • 1970-01-01
            • 2014-06-05
            • 1970-01-01
            • 2023-03-04
            • 1970-01-01
            • 1970-01-01
            • 2022-12-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多