Python 如何在选定字符串上方获得两行?

Python 如何在选定字符串上方获得两行?,python,Python,假设我有这样的文本: www.something.com get the 2 above www.somethingss.com get the 2 above www.somethingssss.com get the 2 above for a in text: if 'get the 2 above' in a: get 2 above 也许是这样的: www.something.com get the 2 above www.something

假设我有这样的文本:

www.something.com

get the 2 above

www.somethingss.com

get the 2 above

www.somethingssss.com

get the 2 above
for a in text:
    if 'get the 2 above' in a:
        get 2 above 
也许是这样的:

www.something.com

get the 2 above

www.somethingss.com

get the 2 above

www.somethingssss.com

get the 2 above
for a in text:
    if 'get the 2 above' in a:
        get 2 above 

我该怎么做?

假设上面是一个字符串:

s = '''www.something.com

get the 2 above

www.somethingss.com

get the 2 above

www.somethingssss.com

get the 2 above'''

s = s.splitlines()
for i, line in enumerate(s):
    if 'get the 2 above' in line:
        print s[i-1], s[i-2]
s.splitlines()
删除换行符;如果要将它们保留在中,请传递
True
,如
s.splitlines(True)
(感谢Sven Marnach)

要从文件中获取行列表,只需执行以下操作:

with open('myfile.txt', 'r') as f:
    s = f.readlines()

假设上面是一个字符串:

s = '''www.something.com

get the 2 above

www.somethingss.com

get the 2 above

www.somethingssss.com

get the 2 above'''

s = s.splitlines()
for i, line in enumerate(s):
    if 'get the 2 above' in line:
        print s[i-1], s[i-2]
s.splitlines()
删除换行符;如果要将它们保留在中,请传递
True
,如
s.splitlines(True)
(感谢Sven Marnach)

要从文件中获取行列表,只需执行以下操作:

with open('myfile.txt', 'r') as f:
    s = f.readlines()

您可以使用itertools配方在iterable上的固定长度“窗口”上进行迭代,以实现以下目的:

import itertools

def windows(iterable, length=2):
    # If iterable is a list, this is equivalent to
    # (iterable[i:i+length] for i in range(len(iterable)-length+1))
    return itertools.izip(*(itertools.islice(it,n,None)
               for n,it in enumerate(itertools.tee(iterable,length))))

text='''\
www.something.com

get the 2 above

www.somethingss.com

get the 2 above

www.somethingssss.com

get the 2 above
'''.splitlines()    

for lines in windows(text,3):
    if lines[2]=='get the 2 above':
        print(lines[0])

# www.something.com
# www.somethingss.com
# www.somethingssss.com

您可以使用itertools配方在iterable上的固定长度“窗口”上进行迭代,以实现以下目的:

import itertools

def windows(iterable, length=2):
    # If iterable is a list, this is equivalent to
    # (iterable[i:i+length] for i in range(len(iterable)-length+1))
    return itertools.izip(*(itertools.islice(it,n,None)
               for n,it in enumerate(itertools.tee(iterable,length))))

text='''\
www.something.com

get the 2 above

www.somethingss.com

get the 2 above

www.somethingssss.com

get the 2 above
'''.splitlines()    

for lines in windows(text,3):
    if lines[2]=='get the 2 above':
        print(lines[0])

# www.something.com
# www.somethingss.com
# www.somethingssss.com

轻松破解:颠倒列表。然后按照正确的顺序进行迭代,这很容易:

lines = iter(reversed(s.splitlines()))
for line in lines:
    if <whatever>:
        next(lines)
        yield next(lines)
lines=iter(反向(s.splitlines())
对于行中的行:
如果:
下一行
下一个(行)

(编辑:修复大脑放屁,谢谢@Sven)

简易黑客:撤销列表。然后按照正确的顺序进行迭代,这很容易:

lines = iter(reversed(s.splitlines()))
for line in lines:
    if <whatever>:
        next(lines)
        yield next(lines)
lines=iter(反向(s.splitlines())
对于行中的行:
如果:
下一行
下一个(行)
(编辑:固定大脑放屁,谢谢@Sven)

结果

deque(['www.something0.com'], maxlen=2)
deque(['www.something0.com', 'www.somethingss1.com'], maxlen=2)
deque(['www.somethingss1.com', 'www.somethingssss2.com'], maxlen=2)
deque(['www.somethingssss2.com', 'www.somethingss3.com'], maxlen=2)
deque(['www.somethingss4.com', 'www.somethingss5.com'], maxlen=2)

=================

www.something0.com get the 2 above
 www.somethingss1.com
 www.somethingssss2.com
 www.somethingss3.com
 www.somethingss5.com
结果

deque(['www.something0.com'], maxlen=2)
deque(['www.something0.com', 'www.somethingss1.com'], maxlen=2)
deque(['www.somethingss1.com', 'www.somethingssss2.com'], maxlen=2)
deque(['www.somethingssss2.com', 'www.somethingss3.com'], maxlen=2)
deque(['www.somethingss4.com', 'www.somethingss5.com'], maxlen=2)

=================

www.something0.com get the 2 above
 www.somethingss1.com
 www.somethingssss2.com
 www.somethingss3.com
 www.somethingss5.com

text
是指一个字符串还是一个打开的文件对象?它是指一个字符串在这种情况下,in-text的循环
将在字符串的字符上循环,而您可能打算
是指in-text.splitlines()
text
是指字符串还是打开的文件对象?它是指字符串在这种情况下,文本中的循环
将在字符串的字符上循环,而您可能希望文本中的循环
。splitlines()
s.splitlines(True)
保留行尾,因此您不需要列表理解。
s.splitlines(True)
保留行尾,因此您不需要列表理解。
next(next(lines))
不起作用。您需要将其拆分为两行:
next(行);生成下一个(行)
next(下一个(行))
不起作用。您需要将其拆分为两行:
next(行);产生下一个(行)
.Um。请尝试
over=deque(maxlen=2)
@thettΖΖΖΖΖΥ非常感谢。我修改了我的代码->更简单、更短、更可读。我会更新你的帖子,我会喜欢,我相信我会找到一个。让我感到羞耻的是:我没有在文档中彻底阅读deque()的定义,事实上我从未使用过。请尝试
over=deque(maxlen=2)
@thettΖΖΖΖΖΥ非常感谢。我修改了我的代码->更简单、更短、更可读。我会更新你的帖子,我会喜欢,我相信我会找到一个。让我感到羞耻的是:我没有在文档中彻底阅读deque()的定义,事实上我从未使用过它。