我要做的是逐行查看文档,找到每个空白行,继续遍历,直到我点击下一行文本,然后弹出该行。 所以,例如,我想要做的是:
第1段 这是一条线 这是另一条线。
这是一个空格后面的一行,我想弹出! 这是下一行,我想保留。
这是我要弹出的另一条线。
因此,它将遍历每个空行数,直到它到达下一个句子,并且仅弹出该句子,然后继续。我想我应该使用re.split('\ n'),但我不确定。 对不起,我没有发布的代码,但我真的不知道从哪里开始 任何帮助将不胜感激,谢谢! 这是一个更大的代码的一部分,我已经工作了几天和几天,并已经弄清楚到这一点,所以我已经完成了大部分的。
答案 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