grep python ищет шаблон, а затем количество строк до - PullRequest
2 голосов
/ 04 февраля 2011

Я собираюсь сделать эквивалент _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

Ответы [ 3 ]

7 голосов
/ 04 февраля 2011

Вместо того, чтобы просто набирать 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 голос
/ 04 февраля 2011

благодаря Дэну я получил свой результат

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 голосов
/ 04 февраля 2011

Вы можете разбить одну строку на список строк, используя mystr.splitlines().Вы можете проверить, соответствует ли строка регулярному выражению, используя re.match().Как только вы найдете подходящую строку (и), вы можете индексировать назад в свой список строк, чтобы найти 14-ю строку раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...