【问题标题】:Regular Expression different results from other languages正则表达式与其他语言的结果不同
【发布时间】:2017-11-10 03:09:15
【问题描述】:

所以我一直在开发一个网络爬虫来解析我喜欢的新闻网站的可读内容,并且我在 python2 中大量使用了正则表达式。我访问了https://regexr.com/ 以再次检查我是否有适合此用例的正确表达式,但我不断得到与预期不同的结果,特别是当我交叉引用 regexr 的输出时。这是表达式

re.compile(ur"[\s\S\]*<p.*>([\s\S]+?)<\/p>")

这是我尝试匹配的 html

</figcaption></figure><p>Researchers at MIT and several other
institutions have developed a method for making photonic ...

它并没有最终关闭一段时间,但程序根本没有抓住这个部分,只有在 in 之后

ygen levels</a>, and even blood pressure.</p>

它是否开始抓取 html(编辑:p 元素)。我想我对不同正则表达式引擎的不一致感到困惑,我试图弄清楚何时何地修改我的语法,在这种情况下是为了抓取整个 p 元素,但通常也是如此。这是我第一次在这里发帖,所以我的格式可能不正确,但提前谢谢大家。已经潜伏了一段时间。

【问题讨论】:

  • 你的解释很晦涩。如果您将示例附在 regexr.com 上(或 regex101.com 上),这不会造成伤害。提示:尝试捕获标签结尾,首先将其排除在外,例如&lt;p[^&gt;]*&gt;。此外,您在模式中有一个未关闭的开口(
  • 您为什么要尝试使用正则表达式解析 html...?可能是not a great idea
  • 啊,那么在我们关闭模式开头的括号之前,首先检查是否存在其他内容的函数?而且这里使用的表达式和我在 regexr.com 上测试的一样。感谢您对 regex101.com 的参考,我必须检查一下。有任何其他技巧可以让我的帖子更具体一点吗?
  • @roganjosh 对不起,我猜 parse 是错误的词。我的意思是拼出来。我正在尝试从每一行 html 中捕获我想要的所有元素。
  • @roganjosh 让我崩溃了。我以前用过 BeautifulSoup,但我想更多地使用它。感觉就像我在抽象层的工作上作弊,我真的很想看看我是否可以只用自己的表情来做我需要的事情,但事实证明这很天真。我以前用过 BeautifulSoup 时也有不正常的行为,但这可能是我的错,所以我必须再试一次。谢谢!

标签: python html regex web-crawler


【解决方案1】:

表达式 [\s\S]* 将匹配所有内容,因此将直接超过标记的开头。

在标签内,你的表达式 p.* 是贪婪的,不会停在最近的右括号。采用 。*?对于非贪婪。

您似乎在正则表达式中还有许多其他语法错误。剪切并粘贴一个有效的正则表达式。

一般来说,使用适当的 HTML 解析库会更容易且不易出错,即使是非常简单的任务也是如此。例如,请参阅 lxml 中的解析器。

【讨论】:

  • 谢谢,我得去看看。我可能对用例模棱两可,我还在每个换行符拆分 html 响应,所以我使用全部捕获来补偿我在测试引擎和我的 python2 版本之间遇到的不一致。贪婪是有点故意的。不过感谢您的建议,肯定可以改进
【解决方案2】:

也许是因为你的正则表达式中没有右括号 )?

尝试从这个开始,然后构建它:

import re

s = """</figcaption></figure><p>Researchers at MIT and several other
institutions have developed a method for making photonic</p>"""

r = re.compile(r"<p>([\w\W ]*)</p>")

a = r.search(s)
print(a.group(1))

请注意,您不必转义正斜杠。

【讨论】:

  • 抱歉,我会修改它。确实有。
  • 我更新了这篇文章,为您提供了一个可以帮助您入门的工作示例。
  • 啊,谢谢。是的,我最终再次尝试了它,但并没有产生明显的不同,但我认为您的表达方式更适合用例。我认为它最终成为一个问题,即运行正则表达式的 html 太可怕了。我还想以非贪婪的方式捕获 p 元素内的任何内容。可能不清楚
  • 酷,希望这能让你有所收获。记得标记正确的答案。
  • 谢谢!编辑:在我之前说的非贪婪时尚的评论中,我实际上是指贪婪。
【解决方案3】:

在这种情况下,我最终得到了我想要的响应,并将 @marekful 的表达式替换为帖子中提到的正则表达式。谢谢大家的帮助!

re.compile(ur"[\s\S\]*?<p[^>]*>([\w\W])*</\p>")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 2019-08-28
    • 2014-09-10
    • 2012-09-10
    相关资源
    最近更新 更多