python练习--模拟grep -B功能

测试文件

$ head -20 test.txt 
python
akdfj
adfkjakd
adfka;sdlfk
adfkasdf
kdasfjaslkdf
dfskafjadsl
python
adaksf
dkfsafj
dkfsafj
dkfsafj
dkfsafj
dkfsafj
dkfsafj
dkfsafj
dkfsafj
dkfsafj
dkfsafj
dkfsafj

方法一:

$ cat grep_B_1.py 
# -*- encoding = utf-8 -*-

"""
This module supply the same fuction of grep -B N

:param filename
:param pattern
:param maxlen

Usage:

  >>> python grep_B_1.py test.txt python 3

"""

from __future__ import print_function
import sys
import collections

def grep_B(filename, pattern, maxlen=3):
    """
    """
    with open(filename, 'r') as f:
        q = collections.deque(maxlen=int(maxlen))
        for line in f:
            if pattern in line:
                print(''.join(q), end='')
                print(line, end='')
                print('-' * 20)
            q.append(line)

if __name__ == '__main__':
    grep_B(*sys.argv[1:])

测试结果一:

$ python grep_B_1.py test.txt python 3
python
--------------------
adfkasdf
kdasfjaslkdf
dfskafjadsl
python
--------------------

方法二:

$ cat grep_B_2.py 
# -*- encoding = utf-8 -*-

"""
"""

from __future__ import print_function
import sys
import re

def grep_B(filename, pattern, maxlen):
    """
    """
    with open(filename, 'r') as f:
        context = ''.join(f.readlines())
    m = re.compile(r'(\n.*){0,3}')
    l = re.split('(.*' + pattern + '.*\n)', context)
    for b,a in zip(l[0::2], l[1::2]):
        print(m.match(b[::-1]).group(0)[::-1], end='')
        print(a, end='')
        print('-' * 20)

if __name__ == '__main__':
    grep_B(*sys.argv[1:])
$ python grep_B_2.py test.txt python 3
python
--------------------
adfkasdf
kdasfjaslkdf
dfskafjadsl
python
--------------------

 

转载于:https://www.cnblogs.com/sky58/p/8635778.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值