Python grep查找模式及其前面的若干行

3

我想要做的相当于_grep -B14 MMA

我有一个URL,打开后会输出许多行。 我想要:

  1. 找到包含“MMa”的行
  2. 然后打印它前面的第14行

我甚至不知道该从哪里开始。

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

当多行匹配时,预期的结果是什么? - dwlz
你怎么不知道从哪里开始呢?你必须有一个开始的想法。 - Falmarri
3个回答

8

不要仅对响应对象进行裸的read操作,而是调用readlines,然后在每一行上运行一个正则表达式。如果该行匹配,则打印其前面的第14行,但要检查您是否在负索引。例如:

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

多亏了丹,我得到了我的结果

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()

~


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

在这种情况下,“search”可能比“match”更合适。 - dwlz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接