2011-02-04 3 views
2

Я ищу сделать эквивалент _grep -B14 MMAпитон Grep ищет шаблон, а затем количество строк перед

У меня есть URL-адрес, который я открываю, и он выплевывает много линий. Я хочу

  1. найти строку, которая имеет «мма»
  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 
+0

Каков ожидаемый результат, если соответствует более чем одна строка? –

+0

Как вы не знаете, с чего начать? У вас должна быть ИДЕЯ, с чего начать. – Falmarri

ответ

7

Вместо того, чтобы просто сделать пустой объект 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

Спасибо, Дэн, это работает! –

0

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

+0

В этой ситуации 'поиск', вероятно, лучше подходит, чем' match'. –

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

~

Смежные вопросы