Python 如何复制多行?

Python 如何复制多行?,python,regex,Python,Regex,我有以下文件: 这是第一行 这是第二行 现在是第三行 哇,第四行 但现在是第五行了 等 等 等 从“现在是第三行”到“但现在是第五行”,我如何复制这三行(不知道这些行的行号)?在perl中,您可以执行以下操作: /^now it is/../^but now/ python中的等价物是什么 我有(这显然只抓住了其中一行): regex=re.compile(“现在是”) 对于内容中的行: 如果正则表达式匹配(第行): 打印行 编辑: 这张照片是: n o w i t i s . .

我有以下文件:

这是第一行
这是第二行
现在是第三行
哇,第四行
但现在是第五行了
等
等
等
从“现在是第三行”到“但现在是第五行”,我如何复制这三行(不知道这些行的行号)?在perl中,您可以执行以下操作:

/^now it is/../^but now/
python中的等价物是什么

我有(这显然只抓住了其中一行):

regex=re.compile(“现在是”)
对于内容中的行:
如果正则表达式匹配(第行):
打印行
编辑:

这张照片是:

n
o
w

i
t

i
s

.
.
.
即返回字符,而不是整行

f = open("yourfile") #that is, the name of your file with extension in quotes
f = f.readlines()
现在f将是文件中每一行的列表。f[0]将是第一行,f[1]将是第二行,依此类推。要抓住第三到第五行,可以使用f[2:5]

现在f将是文件中每一行的列表。f[0]将是第一行,f[1]将是第二行,依此类推。为了抓住第三到第五行,你会使用f[2:5]

类似的东西吗

import re
valid = False
for line in open("/path/to/file.txt", "r"):
    if re.compile("now it is").match(line):
        valid = True
    if re.compile("but now").match(line):
        valid = False
    if valid:
        print line
这样一次只缓存一行,而不是使用
readlines()
将整个文件缓存在内存中

这是假设正则表达式模式在文本块中是唯一的,如果不是这种情况,请提供有关如何精确匹配起始行和结束行的更多信息

如果您只需要检查行的开头是否匹配,则更容易:

valid = False
for line in open("/path/to/file.txt", "r"):
    if line.startswith("now it is"):
        valid = True
    if line.startswith("but now"):
        valid = False
    if valid:
        print line
像这样的

import re
valid = False
for line in open("/path/to/file.txt", "r"):
    if re.compile("now it is").match(line):
        valid = True
    if re.compile("but now").match(line):
        valid = False
    if valid:
        print line
这样一次只缓存一行,而不是使用
readlines()
将整个文件缓存在内存中

这是假设正则表达式模式在文本块中是唯一的,如果不是这种情况,请提供有关如何精确匹配起始行和结束行的更多信息

如果您只需要检查行的开头是否匹配,则更容易:

valid = False
for line in open("/path/to/file.txt", "r"):
    if line.startswith("now it is"):
        valid = True
    if line.startswith("but now"):
        valid = False
    if valid:
        print line

我想你只需要看看。由于它,您可以执行类似的匹配,并从您想要的行中获得组合的文本

编辑:

完整的解决方案包括使用
re.MULTILINE
re.DOTALL
标志,以及非贪婪regexp:

>>> text = """this is the first line
and this is the second line
now it is the third line
wow, the fourth line
but now it's the fifth line
etc...
etc...
etc..."""
>>> import re
>>> match = re.search('^(now it is.*?but now.*?)$', text, flags=re.MULTILINE|re.DOTALL)
>>> print match.group()
now it is the third line
wow, the fourth line
but now it's the fifth line

我想你只需要看看。由于它,您可以执行类似的匹配,并从您想要的行中获得组合的文本

编辑:

完整的解决方案包括使用
re.MULTILINE
re.DOTALL
标志,以及非贪婪regexp:

>>> text = """this is the first line
and this is the second line
now it is the third line
wow, the fourth line
but now it's the fifth line
etc...
etc...
etc..."""
>>> import re
>>> match = re.search('^(now it is.*?but now.*?)$', text, flags=re.MULTILINE|re.DOTALL)
>>> print match.group()
now it is the third line
wow, the fourth line
but now it's the fifth line

你可以很容易地做一个发电机来做这件事

def re_range(f, re_start, re_end):
    for line in f:
        if re_start.match(line):
            yield line
            break
    for line in f:
        yield line
        if re_end.match(line):
            break
你可以这样称呼它

import re

re_start = re.compile("now it is")
re_end = re.compile("but now")
with open('in.txt') as f:
    for line in re_range(f, re_start, re_end):
        print line,

你可以很容易地做一个发电机来做这件事

def re_range(f, re_start, re_end):
    for line in f:
        if re_start.match(line):
            yield line
            break
    for line in f:
        yield line
        if re_end.match(line):
            break
你可以这样称呼它

import re

re_start = re.compile("now it is")
re_end = re.compile("but now")
with open('in.txt') as f:
    for line in re_range(f, re_start, re_end):
        print line,

我刚刚做了一个编辑…如果我不知道行号(我不知道),我该怎么做?@user522962如果你试图通过字符串内容匹配,请在f内的行上运行for循环,询问字符串内容是否符合你的要求。很抱歉,如果您不想按内容或行号进行匹配,我真的不知道您要的是什么。我建议不要使用readlines(),因为它会将整个文件放入内存中。根据文件的大小,这可能是一个问题。我刚刚做了一个编辑…如果我不知道行号(我不知道),我该怎么做?@user522962如果您试图按字符串内容进行匹配,请在f内的行上运行for循环,询问字符串内容是否符合您的要求。很抱歉,如果您不想按内容或行号进行匹配,我真的不知道您要的是什么。我建议不要使用readlines(),因为它会将整个文件放入内存中。根据文件的大小,这可能是一个问题。这看起来不错,但我不太确定如何使用它…类似于re.compile(r“^now it.*但现在是$”,re.MULTILINE)?@user522962:类似于此,但您还应该添加另一个标志(),使
也匹配换行符,您还应该在
$
之前添加
*
,以匹配最后一行的剩余部分。您想查看完整的解决方案,还是这就足够您解决问题了?@user522962:请查看我的编辑-我已经为您提供了完整且有效的解决方案。当前解决方案的问题在于它使用了贪婪的限定符。有关详细信息,请参见,尤其是字符
*?
/
+?
/
。这看起来不错,但我不太确定如何使用它…类似于re.compile(r“^now it..*。但是现在是$”,re.MULTILINE)?@user522962:类似于此,但您还应该添加另一个标志(),这将使
也匹配换行字符,您还应该在
$
之前添加
*
,以匹配最后一行的剩余部分。您想查看完整的解决方案,还是这就足够您解决问题了?@user522962:请查看我的编辑-我已经为您提供了完整且有效的解决方案。当前解决方案的问题在于它使用了贪婪的限定符。有关详细信息,请参见,尤其是字符
*?
/
+?
/
??