搜索文档中的每个空行,然后弹出第一行?

时间:2013-03-14 22:28:49

标签: python

我要做的是逐行查看文档,找到每个空白行,继续遍历,直到我点击下一行文本,然后弹出该行。 所以,例如,我想要做的是:

  

第1段   这是一条线   这是另一条线。

     

这是一个空格后面的一行,我想弹出!   这是下一行,我想保留。

     

这是我要弹出的另一条线。

因此,它将遍历每个空行数,直到它到达下一个句子,并且仅弹出该句子,然后继续。我想我应该使用re.split('\ n'),但我不确定。 对不起,我没有发布的代码,但我真的不知道从哪里开始 任何帮助将不胜感激,谢谢! 这是一个更大的代码的一部分,我已经工作了几天和几天,并已经弄清楚到这一点,所以我已经完成了大部分的。

5 个答案:

答案 0 :(得分:1)

如果你执行for line in filehandle:,它将遍历每一行。如果前一行为空时有一个标志为真,则可以跳过下一行,然后重置标志。

答案 1 :(得分:1)

我认为原始海报(OP)想要就地删除这些行,这意味着从文件中删除这些行。这是一个经过修改的解决方案(我以前的解决方案不合时宜。感谢J.F Sebastian告诉我。

import fileinput

def remove_line_after_blank(filename, in_place_edit=False):
    previous_line = ''
    for line in fileinput.input(filename, inplace=in_place_edit):
        if not (previous_line == '\n' and line != '\n'):
            print line.rstrip()
        previous_line = line

if __name__ == '__main__':
    remove_line_after_blank('data.txt', in_place_edit=True)

讨论

  • 如果您不想修改原始数据文件,请删除, in_place_edit=True

答案 2 :(得分:1)

迄今为止最简单的新手解决方案可能就是史蒂夫建议的方式:只需迭代这些行,并使用一个标记来跟踪最后一行是否为空行。

但是,如果您想要更高级别的解决方案,则需要在更高级别重新考虑问题。你实际想要指定的是每个段落的第一行,但第一行,其中“段落”是由空行划分的东西。正确?

那么,你怎么能这样做?好吧,你可以像'\n\n'一样轻松地在\n上分开。所以:

paragraphs = document.split('\n\n')
first_lines = [paragraph.partition('\n')[0] for paragraph in paragraphs]
popped_lines = first_lines[1:]

(我在这里使用了partition而不是split,因为它只在第一个'\n'分割,剩下的只剩下其余的了,因为它处理一行的段落 - { {1}}不会。)

但是你不想要一个弹出行的列表,你想要一个的列表但弹出的行,对吗?

paragraph.split('\n', 1)

如果你想把它变回文件:

paragraphs = document.split('\n\n')
first, rest = paragraphs[0], paragraphs[1:]
rest_edited = [paragraph.partition('\n')[1] for paragraph in rest]

你可以通过使用切片赋值来缩短这一点,虽然我不确定它是否具有可读性:

all_edited = [first] + rest_edited
document_edited = '\n\n'.join(all_edited)

正如J.F. Sebastian指出的那样,这个问题有点含糊不清。 “空行”是指“空行”还是“只有空格的行”?如果是后者,事情就会复杂一些,而最简单的解决方案可能 是一个简单的正则表达式(paragraphs = document.split('\n\n') paragraphs[1:] = [paragraph.partition('\n')[1] for paragraph in paragraphs[1:]] document_edited = '\n\n'.join(paragraphs) ),用于分割成段落。


同时,如果你拥有的是一系列线条(并注意文件是一系列线条!)而不是一个大字符串,你可以通过几种不同的方式完成这一操作而不需要分割。

例如,段落是非空行的组,对吧?因此,您可以使用r'\n\s*\n'函数来获取它们:

groupby

或者,如果“空白”并不意味着“空”:

groups = itertools.groupby(lines, bool)

请注意,这会为每个段落提供groups = itertools.groupby(lines, lambda line: not line.strip()) ,并为每个空白行提供(False, <sequence of lines>)。如果你想原样保留空白行,你可以 - 但是如果你很高兴只用一个空行替换每一行空白行(你显然是“空白” 意味着“空”,可能更容易丢掉空白的段落:

(True, <sequence of blank lines>)

然后你可以从除第一组之外的所有元素中删除第一个元素,最后将这些组重新链接成一个大的序列:

paragraphs = (group for (key, group) in paragraphs if not key)

最后,如果连续多行空行怎么办?那么,首先你必须决定如何处理它们。如果你有两个空白行,你会删除第二行吗?如果是这样,你是否删除了下一段的第一行(因为它最初是在一个空行之后),或者没有(因为它之后的空白行已被删除)?如果你连续三个怎么办?分割first = next(paragraphs) edited_paragraphs = (itertools.islice(paragraph, 1) for paragraph in paragraphs) edited_document = itertools.chain(first, *edited_paragraphs) 会做一件事,分开'\n\n'另一件事,而'\n\s*\n'分开......但是直到你知道你想要什么,就不可能说哪个是“正确”或者当然,如何“修复”其他人。

答案 3 :(得分:0)

使用re.findall匹配字符串中的所有匹配项:

>>> text = """Paragraph 1
This is a line.
This is another line.

Here is a line after a space, which I want to pop!
Here is the next line, which I want to keep.

Here is another line I want to pop."""
>>> re.findall("\n\n+(.+)", text)
['Here is a line after a space, which I want to pop!', 'Here is another line I want to pop.']
>>> re.findall("\n\n+(.+)$", text, re.MULTILINE)
['Here is a line after a space, which I want to pop!', 'Here is another line I want to pop.']

答案 4 :(得分:-1)

最简单的方法是在换行符上拆分文字:

lines = your_string.split("\n")

这会将其分解为一个数组(存储在lines)中,其中数组的每个元素都是一个单独的文本行。 (如评论中所述,如果你已经有了一个文件对象,你可以循环使用它。)

然后你可以浏览lines的每一行,检查换行符。如果找到一个,你可以“弹出”下一个。 (我不知道你的意思是pop,所以我只需要打印出你想要的代码。)

for line in lines:
  if print_next_line:
     print(line)
     print_next_line = False

  if line == "":
    print_next_line = True