python grep之前寻找一个模式然后是一些行

时间:2011-02-04 19:48:50

标签: python grep lines

我希望做相当于_grep -B14 MMA

的事情

我有一个我打开的网址,它会吐出很多行。 我想

  1. 找到包含' MMa'
  2. 然后打印前面的第14行
  3. 我甚至不知道从哪里开始。

    import urllib
    import urllib2
    
    url = "https://longannoyingurl.com"
    
    opts = {
      'action': 'Dump+It'
    }
    data = urllib.urlencode(opts)
    req = urllib2.Request(url, data)
    response = urllib2.urlopen(req)
    print  response.read() # gives the full html output
    

3 个答案:

答案 0 :(得分:7)

而不是仅仅在响应对象上执行裸read,而是调用readlines,然后通过每一行运行正则表达式。如果该行匹配,则在其前面打印第14行,但检查您是否没有否定索引。 E.g。

import re

lines = response.readlines()

r = re.compile(r'MMa')
for i in range(len(lines)):
    if r.search(lines[i]):
        print lines[max(0, i-14)]

答案 1 :(得分:1)

感谢Dan我得到了我的结果

import urllib
import urllib2 
import re

url="https://somelongannoyingurl/blah/servlet"
opts = {
  'authid': 'someID',
   'action': 'Dump+It'
}
data = urllib.urlencode(opts)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)

lines = response.readlines()
r = re.compile(r'MMa')
for i in range(len(lines)):
  if r.search(lines[i]):
    line = lines[max(0, i-14)].strip()
    junk,mma = line.split('>')
    print mma.strip()

答案 2 :(得分:0)

您可以使用mystr.splitlines()将单个字符串拆分为行列表。您可以使用re.match()测试字符串是否与正则表达式匹配。找到匹配的行后,您可以向后索引到行列表中以查找之前的第14行。