1

\n、\r、\t、および単語と他の文字の間のスペースのさまざまな組み合わせを含む長い文字列があります。

  • 複数のスペースをすべて 1 つのスペースに減らしたいと考えています。
  • すべての \n、\r、\t の組み合わせを 1 つの改行文字に減らしたいと考えています。
  • \n、\r、\t、およびスペースのすべての組み合わせも、1 つの改行文字に減らしたいと考えています。

私は''.join(str.split())さまざまな方法で試しましたが、成功しませんでした。

  • ここで正しいPythonicの方法は何ですか?

  • Python 3.x の場合、ソリューションは異なりますか?

元。ストリング:

ex_str = u'Word   \n \t \r   \n\n\n word2    word3   \r\r\r\r\nword4\n    word5'

望ましい出力 [新しい改行 = \n]:

new_str = u'Word\nword2 word3\nword4\nword5'
4

5 に答える 5

5

次のように、すべての空白で組み合わせstr.splitlines()と分割を使用しますstr.split()

'\n'.join([' '.join(line.split()) for line in ex_str.splitlines() if line.strip()])

これにより、各行が個別に処理され、空の行が削除され、行ごとのすべての空白が 1つのスペースにまとめられます。

入力が Python 3 文字列である場合、同じソリューションが両方の Python バージョンで機能します。

デモ:

>>> ex_str = u'Word   \n \t \r   \n\n\n word2    word3   \r\r\r\r\nword4\n    word5'
>>> '\n'.join([' '.join(line.split()) for line in ex_str.splitlines() if line.strip(' ')])
u'Word\nword2 word3\nword4\nword5'

タブを保持するには、スペースだけを削除して分割し、空の文字列を除外する必要があります。

'\n'.join([' '.join([s for s in line.split(' ') if s]) for line in ex_str.splitlines() if line.strip()])

デモ:

>>> '\n'.join([' '.join([s for s in line.split(' ') if s]) for line in ex_str.splitlines() if line.strip(' ')])
u'Word\n\t\nword2 word3\nword4\nword5'
于 2013-07-23T11:39:42.063 に答える
2

単純な正規表現を使用します:

import re
new_str = re.sub(r'[^\S\n]+', ' ', re.sub(r'\s*[\n\t\r]\s*', '\n', ex_str))
于 2013-07-23T11:48:14.770 に答える
0

タブをスペースに置き換える正規表現を使用した別のソリューションu'word1\t\tword2'、または本当にここにも改行を追加しますか?

import re
new_str = re.sub(r"[\n\ ]{2,}", "\n", re.sub(r"[\t\r\ ]+", " ", ex_str))
于 2013-07-23T16:05:26.147 に答える
0

正規表現を使用します。

>>> s
u'Word   \n \t \r   \n\n\n word2    word3   \r\r\r\r\nword4\t    word5'
>>> re.sub(r'[\n\r\t ]{2,}| {2,}', lambda x: '\n' if x.group().strip(' ') else ' ', s)
u'Word\nword2 word3\nword4\nword5'
>>> 
于 2013-07-23T11:58:17.987 に答える
-1
'\n'.join(str.split())

出力:

u'Word\nword2\nword3\nword4\nword5'
于 2013-07-23T11:42:34.513 に答える