【问题标题】:Python regex - multiple searchPython 正则表达式 - 多重搜索
【发布时间】:2011-02-07 17:35:29
【问题描述】:

这是我想要完成的:

  1. 使用 python mechanize 我打开一个站点
  2. 如果内容与我的正则表达式不匹配,我会打开另一个网站
  3. 我使用另一个正则表达式执行搜索

以及提取的代码:

m = re.search('<td>(?P<alt>\d+)', response.read())
...
m = re.search('<td>(?P<alt>\w+)', response.read())
print m.group('alt')

我明白了:

AttributeError: 'NoneType' object has no attribute 'group'

如果我取消注释第二次搜索一切都很好。我不明白这种行为。

这样的错误将我重定向到 this stackoverflow issuethis - 但无济于事 - 这些都没有解决我的问题。

我不关心这里的效率所以我不使用compile

【问题讨论】:

  • 每个 response.read() 的未过滤结果是什么?我敢打赌,第二次阅读不会返回您期望的结果。
  • 您能否通过调用 re.search 两次来添加更多有关您尝试执行的操作的详细信息?当前的示例代码没有意义。
  • @kramthegram - 谢谢!你是对的。这不是正则表达式问题。 @shang - 因为 response.read() 在这两行之间发生了变化 - 见我问题的第二点。

标签: python regex mechanize


【解决方案1】:

假设response 是一个类似文件的对象,第二次调用read 可能会在您之前使用该文件时返回一个空字符串。

data = response.read()
m = re.search('<td>(?P<alt>\d\d*)', data)
m = re.search('<td>(?P<alt>\d\d*)', data)
print m.group('alt')

为什么要多次致电search

【讨论】:

  • 你是对的 - 谢谢!所以这不是正则表达式问题。我的错。我想多次调用搜索,因为这两行之间的数据可能会发生变化(我的问题的第二点)。
  • @laszchamachla 在那种情况下,我看不出这有什么帮助。如果我对您的理解正确,您将获得页面 A,搜索其数据,如果没有匹配项,您将执行新请求并搜索该数据。如果在两次搜索之间发出新请求并获得新响应,则应该没有问题。
  • @Reiner - 确切地说,这对我来说也很奇怪。但是,正如您所建议的,在每次搜索解决问题之前将 response.read() 分配给变量。
  • 另外我建议编译一次正则表达式:rx = re.compile('&lt;td&gt;(?P&lt;alt&gt;\d\d*)'),然后在需要的地方重新使用它:m = rx.search(data)
  • @9000 - 我写道:“我不关心这里的效率,所以我不使用编译。” - 这不是本案的重点,但感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 2015-02-23
  • 2015-05-30
相关资源
最近更新 更多