web-dev-qa-db-ja.com

python文字列から空行を削除するための簡単なワンライナーは何ですか?

python余分な空行を含む文字列にコードがあります。文字列からすべての空行を削除したいと思います。これを行うための最もPython的な方法は何ですか?

注:一般的なコード再フォーマッターを探しているのではなく、1つまたは2つの簡単なライナーを探しています。

ありがとう!

55
Andrew Wagner

どうですか:

text = os.linesep.join([s for s in text.splitlines() if s])

textは、考えられる余分な行を含む文字列ですか?

80
"\n".join([s for s in code.split("\n") if s])

編集2:

text = "".join([s for s in code.splitlines(True) if s.strip("\r\n")])

それが私の最終バージョンだと思います。行末が混在するコードでもうまく機能するはずです。スペースのある行は空と見なされるべきではないと思いますが、そうであれば単純なs.strip()が代わりに行います。

14
filter(None, code.splitlines())
filter(str.strip, code.splitlines())

と同等です

[s for s in code.splitlines() if s]
[s for s in code.splitlines() if s.strip()]

そして読みやすさのために役立つかもしれません

12
ymv

スペースを含む改行と空行の削除に関するレッスン

「t」はテキストを含む変数です。 「s」変数が表示されます。これは、カッコのメインセットの評価中にのみ存在する一時変数です(これらの名前を忘れていましたpython things)

最初に「t」変数を設定して、新しい行を追加します。

>>> t='hi there here is\na big line\n\nof empty\nline\neven some with spaces\n       \nlike that\n\n    \nokay now what?\n'

三重引用符を使用して変数を設定する別の方法があることに注意してください

somevar="""
   asdfas
asdf

  asdf

  asdf

asdf
""""

「印刷」なしで表示すると、次のようになります。

>>> t
'hi there here is\na big line\n\nof empty\nline\neven some with spaces\n       \nlike that\n\n    \nokay now what?\n' 

実際の改行で確認するには、印刷してください。

>>> print t
hi there here is
a big line

of empty
line
even some with spaces

like that


okay now what?

スペースを含むすべての空白行を削除するコマンド:

いくつかの改行は単なる改行であり、いくつかはスペースを持っているので改行のように見えます

空白のように見えるすべての行を削除する場合(改行だけ、またはスペースもある場合)

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip()])
hi there here is
a big line
of empty
line
even some with spaces
like that
okay now what?

または:

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip("\r\n").strip()])
hi there here is
a big line
of empty
line
even some with spaces
like that
okay now what?

注:t.strip()。splitline(True)のストリップは削除できるので、そのt.splitlines(True)だけを削除できますが、出力は余分な改行で終わる可能性があります(最終的な改行を削除します)。最後の部分のstrip()s.strip( "\ r\n")。strip()およびs.strip()は、改行および改行のスペースを実際に削除するものです。

コマンドはすべての空白行を削除します(スペースは使用できません):

技術的にはスペースのある行は空とみなすべきではありませんが、それはすべてユースケースと何を達成しようとしているかによって異なります。

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip("\r\n")])
hi there here is
a big line
of empty
line
even some with spaces

like that

okay now what?

**ミドルストリップについての注意**

そこにある中央のストリップ( "t"変数に付加されたthat)は、最後の改行を削除するだけです(前のメモで述べたように)。ここに、そのストリップが存在しない場合の様子を示します(最後の改行に注意してください)

最初の例(改行とスペースを含む改行の削除)

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip("\r\n").strip()])
hi there here is
a big line
of empty
line
even some with spaces
like that
okay now what?
.without strip new line here (stackoverflow cant have me format it in).

2番目の例(改行のみを削除)

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip("\r\n")])
hi there here is
a big line
of empty
line
even some with spaces

like that

okay now what?
.without strip new line here (stackoverflow cant have me format it in).

終わり!

10
kossboss

re.sub 関数を使用して

re.sub(r'^$\n', '', s, flags=re.MULTILINE)
5
fbessho

1行のソリューションを次に示します。

print("".join([s for s in mystr.splitlines(True) if s.strip()]))
2
jasonleonhard

これもスペースの行を削除します。

re.replace(u'(?imu)^\s*\n', u'', code)

2
peterdemin

たくさんの空の行を削除したかったのですが、うまくいったのは次のとおりです。

if len(line) > 2:
    myfile.write(output)

\ r\nをカバーしていたので、2を使用しました。書式設定の見栄えを良くするために、いくつかの空の行が必要だったので、使用する必要がありました。

print("    \n"
0
Ben

このコードは、空行を削除します(空白の有無は問わない)。

import re    
re.sub(r'\n\s*\n', '\n', text, flags=re.MULTILINE)
0
rfedorov

ymvの答えを拡張すると、filterjoinとともに使用して、目的の文字列を取得できます。

"".join(filter(str.strip, sample_string.splitlines(True)))
0
Sufiyan Ghori

そして今、完全に異なるもののために:

Python 1.5.2 (#0, Apr 13 1999, 10:51:12) [MSC 32 bit (Intel)] on win32
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> import string, re
>>> tidy = lambda s: string.join(filter(string.strip, re.split(r'[\r\n]+', s)), '\n')
>>> tidy('\r\n   \n\ra\n\n   b   \r\rc\n\n')
'a\012   b   \012c'

エピソード2:

これは1.5では機能しません:-(

しかし、それは普遍的な改行と空白行を処理するだけでなく、末尾の空白も削除し(コード行を整理するときは良い考えです)、最後の意味のある行が終了していない場合は修復ジョブを実行します。

import re
tidy = lambda c: re.sub(
    r'(^\s*[\r\n]+|^\s*\Z)|(\s*\Z|\s*[\r\n]+)',
    lambda m: '\n' if m.lastindex == 2 else '',
    c)
0
John Machin