1

私がしようとしているのは、ドキュメントを 1 行ずつ調べて、各空白行を見つけ、次のテキスト行に到達するまでトラバースし続け、その行をポップすることです。たとえば、私がやりたいことは次のとおりです。

パラグラフ 1
これは一行です。
これは別の行です。

これは、ポップしたいスペースの後の行です!
これが、私が保持したい次の行です。

ここに私がポップしたい別の行があります。

したがって、次の文に到達するまで各数の空白行を通過し、その文のみをポップして続行します。re.split('\n') を使用する必要があると考えていますが、よくわかりません。申し訳ありませんが、投稿するコードがありませんが、どこからヘルプを開始すればよいか本当にわかりません。よろしくお願いします! これは、私が何日も何日もかけて取り組んできた大きなコードの一部であり、この時点までに理解したので、単語の大部分を実行しました。

4

5 に答える 5

1

これを行うfor line in filehandle:と、各行で繰り返されます。前の行が空白のときにtrueのフラグがある場合は、次の行をスキップしてからフラグをリセットできます。

于 2013-03-14T22:31:48.400 に答える
1

元のポスター (OP) がそれらの行をインプレースで削除したい、つまりファイルからそれらの行を削除したいと思っていると思います。これが修正された解決策です(私の以前の解決策は的外れでした。教えてくれたJF 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ます。
于 2013-03-14T22:36:22.063 に答える
1

初心者にとって最も簡単な解決策は、おそらく Steve が提案した方法です。行を繰り返し、フラグを使用して、最後の行が空白行であったかどうかを追跡します。

しかし、より高いレベルの解決策が必要な場合は、より高いレベルで問題を再考する必要があります。実際に指定しようとしているのは、すべての段落の最初の行ですが、「段落」は空の行で区切られたものです。右?

それで、どうすればそれができますか?まあ、 on と'\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)

スライス割り当てを使用して少し短くすることができますが、読みやすいかどうかはわかりません。

paragraphs = document.split('\n\n')
paragraphs[1:] = [paragraph.partition('\n')[1] for paragraph in paragraphs[1:]]
document_edited = '\n\n'.join(paragraphs)

JF Sebastian が指摘するように、質問は少しあいまいです。「空白行」は「空の行」または「空白しかない行」を意味しますか? 後者の場合、物事はもう少し複雑になります。最も簡単な解決策r'\n\s*\n'、おそらく段落に分割するための単純な正規表現 ( ) です。


一方、1 つの大きな文字列ではなく、行のシーケンス (ファイルは行のシーケンスであることに注意してください!) がある場合は、いくつかの異なる方法で、まったく分割せずにこれを行うことができます。

たとえば、段落は空白ではない行のグループですよね? したがって、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)

次に、最初のグループ以外のすべてから最初の要素を削除し、最後にグループをチェーンして 1 つの大きなシーケンスに戻すことができます。

first = next(paragraphs)
edited_paragraphs = (itertools.islice(paragraph, 1) for paragraph in paragraphs)
edited_document = itertools.chain(first, *edited_paragraphs)

最後に、連続して複数の空白行がある場合はどうなるでしょうか? まず、それらに対処する方法を決定する必要があります。空行が 2 行ある場合、2 行目は削除しますか? その場合、次の段落の最初の行を削除しますか (最初は空白行の後にあったため)、削除しませんか (その後の空白行が既に削除されているため)。3つ並んだらどうする?分割する'\n\n'と、あること、別のことが分割され'\n\s*\n'groupbyさらに別のことが行われます... しかし、何が必要かがわかるまで、どちらが「正しい」か、または他のものを「修正」する方法を言うことはもちろん不可能です.

于 2013-03-14T22:38:31.450 に答える
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.']
于 2013-03-14T22:35:47.337 に答える
-1

最も簡単な方法は、テキストを改行で分割することです。

lines = your_string.split("\n")

これにより、配列(に格納されているlines)に分割され、配列の各要素は個別のテキスト行になります。(コメントに記載されているように、すでにファイルオブジェクトがある場合は、それをループするだけです。)

次に、の各行をlines調べて、改行を確認します。見つけたら、次のものを「ポップ」することができます。(ポップの意味がわからないので、必要な行をコードで出力するだけです。)

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

  if line == "":
    print_next_line = True
于 2013-03-14T22:33:11.377 に答える