python grep 查找模式及其前几行

3 投票
3 回答
5505 浏览
提问于 2025-04-16 11:15

我想做一个和 _grep -B14 MMA 类似的操作。

我有一个网址,打开后会显示很多行内容。 我想要:

  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

3 个回答

0

你可以用 mystr.splitlines() 把一个字符串分割成一行一行的列表。你还可以用 re.match() 来检查一个字符串是否符合某种规则(正则表达式)。一旦找到符合条件的行,你就可以在你的行列表中向后查找,找到第14行之前的内容。

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

~

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

撰写回答