0

我敢打赌,对于其他蟒蛇玩家来说,这是一个简单的答案。我是一个菜鸟,我一直在寻找答案很长一段时间(几个小时)......

如何在最后一次正则表达式匹配(包括和排除匹配)后返回所有行? 我在玩 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'
4

3 回答 3

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

案例二:

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

但是警告,如果最后一个“字符串匹配”在文件中向上,那么该正则表达式中会有很多回溯。

于 2013-09-23T07:11:08.003 回答
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移动文件位置。

于 2013-09-23T06:50:07.737 回答
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'
于 2013-09-23T09:06:29.480 回答