【问题标题】:regular expressions in python, matching words outside of html tagspython中的正则表达式,匹配html标签之外的单词
【发布时间】:2013-02-12 17:37:11
【问题描述】:

我正在尝试使用正则表达式匹配一个短语,只要该短语中的任何单词都没有出现在 html 标记中。

对于这个例子,我使用的是以下网址:

   url = "http://www.sidley.com/people/results.aspx?lastname=B" 

我使用的正则表达式是:

   regexp = "Babb(?!([^<]+)?>).+?Jonathan(?!([^<]+)?>).+?C(?!([^<]+)?>)"
   page = urllib2.urlopen(url).read()
   re.findall(regexp, page, re.DOTALL)

使用该正则表达式,我得到以下输出:

   [('', '', '')]

当我将正则表达式更改为(*注意外部括号)时:

   regexp = "(Babb(?!([^<]+)?>).+?Jonathan(?!([^<]+)?>).+?C(?!([^<]+)?>))"
   page = urllib2.urlopen(url).read()
   re.findall(regexp, page, re.DOTALL)

我明白了:

   [('Babb, Jonathan C', '', '', '')]

我很困惑为什么会这样。

1) 为什么我会得到这些空字符串作为匹配项? 2)为什么对于第一个正则表达式,我没有得到实际匹配?

最后,

我该如何解决这个问题?

提前感谢您的帮助。

【问题讨论】:

  • 你想从给定的网站上获取什么信息?你应该只使用正则表达式吗?
  • 我可以随心所欲地做到这一点。我一直在做另一种方式,没有使用正则表达式,这是一个非常耗时的过程。我决定改用正则表达式,因为我认为我可以让它更快。基本上,我想取任何短语,并找出它是否存在于页面中(只要它存在于 html 之外)。因此,如果我发送“我喜欢狗,但不喜欢猫”,我想知道页面上是否存在该短语。所以,我的正则表达式可能看起来像这样:“I(?!([^).+?like(?!([^).+?dogs..... "
  • 你检查过美丽的汤吗?它是一个解析 html 的 python 库,它有一个名为 get_text() 的特定函数,可以删除 html 标签。在搜索文本之前删除标签可能更容易。
  • 我希望它从 html 页面返回文本的实际部分,这样我就可以获得开始和结束位置。如果我修改 html 页面,我的结果位置将不正确。

标签: python html regex


【解决方案1】:

您得到空字符串的原因是您使用的是非贪婪。如果您不想要该信息,只需删除一些括号。事实上,您真的应该研究非分组括号或只是一些无关的对。


我将使用(用于整个过程)的最终代码是

import re
import urllib2


url = 'http://www.sidley.com/people/results.aspx?lastname=B'
regexp = 'Babb(?!<+?>).+?Jonathan(?!<+?>).+?C(?!<+?>)'

page = urllib2.urlopen(url).read()
re.findall(regexp, page, re.DOTALL)

正则表达式的分解:

  • 我们选择第一个单词。 Babb
  • 我们想匹配任何 HTML 标签,所以我们使用了一个不能匹配的反组。 (?!)
  • 在其中,我们放置了一个用于选择 HTML 标记的正则表达式(不太清楚为什么是这个特定的表达式起作用,而不是 .+?&gt;)。 &lt;+?&gt;
  • 我们不贪婪地至少再选择一个字符。 .+?
  • 我们对其他每个单词(JonathanC)重复此过程。

【讨论】:

  • 成功了!新的正则表达式是 Babb(?![^).+?Jonathan(?![^).+?C(?![^),去掉了一些的内括号。不幸的是,我对正则表达式实际上是如何做的了解有限,所以我不确定为什么会这样。但我想熟能生巧。
  • 看看我添加的解释,希望对你有所帮助。然而,那一部分仍然让我感到困惑。正则表达式有时令人难以置信......
  • 感谢您的解释。您是否预见到更改 .+ 的主要问题?到 。*?。我可以预见到除了 html 标签(可能是
    )之外,单词之间没有任何空格的情况。在这种情况下,上面的方法会失败,对吧?
  • 不,因为 br 标记是 6 个字符 :) 另外我终于弄清楚了正则表达式——你试图避免匹配 "Punch &lt;and /&gt; Judy" 之类的东西(不是 "Punch &lt;a href='blah'&gt;and&lt;/a&gt; Judy",对吗?跨度>
猜你喜欢
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 2019-04-25
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多