2011-02-04 41 views
2

多條線路,我希望做的_grep -B14 MMA蟒蛇的grep尋找一個圖案,然後前

相當於我有我打開一個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 
+0

什麼是多行匹配時,預期的結果? – 2011-02-04 19:52:09

+0

你怎麼不知道從哪裏開始?你必須有從哪裏開始的IDEA。 – Falmarri 2011-02-04 19:53:45

回答

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

您可以使用mystr.splitlines()將單個字符串拆分爲行列表。您可以使用re.match()來測試字符串是否與正則表達式匹配。一旦找到匹配的行,您可以向後索引到行列表中以查找之前的第14行。

+0

在這種情況下,`search`可能比`match`更適合。 – 2011-02-04 20:05:48

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