python grep 查找模式及其前几行
我想做一个和 _grep -B14 MMA
类似的操作。
我有一个网址,打开后会显示很多行内容。 我想要:
- 找到包含'MMa'的那一行
- 然后打印出它前面的第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)]