python在最后一次正则表达式匹配后返回所有行

时间:2013-09-23 06:44:20

标签: python regex file match

我敢打赌,对于其他傻瓜来说,这是一个简单的答案。 我是一名新手,我一直在寻找一个答案(小时)...

如何在最后一次正则表达式匹配后返回所有行(包括和排除匹配)? 我正在玩python 2.6

数据:

string log 1 
string log 2
string match
string log 4
string match
string log 5
string log 6

预期案例1:

string match
string log 5
string log 6

预期案例2:

string log 5
string log 6

bash在How to get all lines after a line number

发布的相同问题

sed解决方案:

sed -n 'H; /string match/h; ${g;p;}'
sed -n 'H; /string match/h; ${g;p;}' | grep -v 'string match'

3 个答案:

答案 0 :(得分:1)

如果您正在查看较短的代码,可能是吗?

案例1:

>>> import re
>>> input_data = open('path/file').read()
>>> result = re.search(r'.*(string match\s*.*)$', input_data, re.DOTALL)
>>> print(result.group(1))
string match
string log 5
string log 6

案例2:

>>> import re
>>> input_data = open('path/file').read()
>>> result = re.search(r'.*string match\s*(.*)$', input_data, re.DOTALL)
>>> print(result.group(1))
string log 5
string log 6

警告但是,如果最后一个'字符串匹配'在文件中上升,则该正则表达式中将存在批次回溯。

答案 1 :(得分:0)

import sys

with open('/path/to/file', 'rb') as f:
    last_pos = pos = 0
    for line in f:
        pos += len(line)
        if 'string match' in line:
            last_pos = pos
    f.seek(last_pos)
    sys.stdout.writelines(f)

使用循环查找最后一个匹配位置。然后使用file.seek移动文件位置。

答案 2 :(得分:0)

t = '''string log 1 
string log 2
string match
string log 4
string match
string log 5
string log 6'''

me = t.rsplit('string match',1)[1].lstrip()

e = t[t.rfind('string match'):]

print '%s\n\n%r\n\n%r' % (t,me,e)

结果

string log 1 
string log 2
string match
string log 4
string match
string log 5
string log 6

'string log 5\nstring log 6'

'string match\nstring log 5\nstring log 6'