【问题标题】:Regex matching Google Cache url (matching entire href parameter when it contains a word)正则表达式匹配 Google Cache url(匹配整个 href 参数,当它包含一个词)
【发布时间】:2013-08-12 00:11:30
【问题描述】:

免责声明:我知道 html 和 regex 不应该站在一起,但这是一个例外情况。

我需要解析 Google 搜索结果并提取缓存 URL。我在页面上有这个:

<a href="/url?q=http://webcache.googleusercontent.com/search%3Fq%3Dcache:
gsNKb7ku3ewJ:somedata&ei=MyIIUtrZAcPX7AaVzIHwDg&amp;ved=0CB8QIDAC&amp;usg
=AFQjCNGcnWfdzQiTKwyAMmI-M-xzxII5Ag">Cached</a>

我尝试了简单的东西,例如:href=[\'"]?([^\'" &gt;]+),但这不是我需要的。我想从 href 中提取单个参数 (q)。我需要得到:

http://webcache.googleusercontent.com/search%3Fq%3Dcache:gsNKb7ku3ewJ:somedata

所以当内容中包含单词“webcache”时,“url?q=”和第一个“&”之间的所有内容。

【问题讨论】:

  • 据我所知,这不是一个例外情况。你是用 javascript 还是其他东西来做这个?
  • (?&lt;=href=[\'"]?/url\?q=)[^&amp;\'"&gt;]+(?=&amp;) 可以解决问题吗?
  • @WesleyMurch Python ..
  • 为什么不使用 DOM 解析器?

标签: html regex


【解决方案1】:

如果您的语言支持积极的后视:

(?<=q=).*?(?=[&"])

否则用这个表达式匹配组\1

(?:q=)(.*?)(?=[&"])

解释:

  • .*? 是我们表达式的主体。只需匹配所有内容,但不要贪婪!
  • (?&lt;=q=) 是一个积极的后视,它说“q=”应该在比赛之前出现
  • (?=[&amp;"]) 是一个积极的展望,它表示“& 或引用应该在比赛之后出现”

因为我们使用? 使它不贪心,所以它会在第一个引号或& 符号处停止。否则它会一直匹配到结束引号。

【讨论】:

    【解决方案2】:

    在前面使用前瞻,在末尾使用前瞻来断言周围的文本,并在正则表达式中包含关键字:

    (?<=url\?q=)[^&]*webcache[^&]*(?=&)
    

    使用[^&amp;]* 可确保关键字出现在目标字符串中的 & - 之前。

    【讨论】:

      猜你喜欢
      • 2011-05-25
      • 2010-11-15
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多