419

私はこの文字列を持っています:

mystring = 'Here is  some   text   I      wrote   '

ダブル、トリプル (...) の空白文字を単一のスペースに置き換えるにはどうすればよいですか?

mystring = 'Here is some text I wrote'
4

3 に答える 3

896

簡単な可能性(REを避けたい場合)は

' '.join(mystring.split())

分割と結合は、あなたが明示的に求めているタスクを実行します-さらに、あなたが話していない追加のタスクも実行しますが、例では末尾のスペースを削除しています;-)。

于 2010-01-16T15:54:24.517 に答える
177

正規表現を使用すると、結合される空白文字をより細かく制御できます。

Unicode の空白に一致させるには:

import re

_RE_COMBINE_WHITESPACE = re.compile(r"\s+")

my_str = _RE_COMBINE_WHITESPACE.sub(" ", my_str).strip()

ASCII 空白のみに一致させるには:

import re

_RE_COMBINE_WHITESPACE = re.compile(r"(?a:\s+)")
_RE_STRIP_WHITESPACE = re.compile(r"(?a:^\s+|\s+$)")

my_str = _RE_COMBINE_WHITESPACE.sub(" ", my_str)
my_str = _RE_STRIP_WHITESPACE.sub("", my_str)

x0b、x0c、x1c、x1d、x1e、x1f などの制御文字を保持するためには、ASCII 空白のみの一致が不可欠な場合があります。

参照:

\s:

Unicode (str) パターンの場合: Unicode の空白文字 ([ \t\n\r\f\v] を含む) と、多くの言語のタイポグラフィ規則で義務付けられている改行なしのスペースなど、他の多くの文字に一致します。ASCII フラグが使用されている場合、[ \t\n\r\f\v] のみが一致します。

re.ASCII:

\w、\W、\b、\B、\d、\D、\s、および \S が、完全な Unicode マッチングではなく、ASCII のみのマッチングを実行するようにします。これは Unicode パターンでのみ意味があり、バイト パターンでは無視されます。インライン フラグ (?a) に対応します。

strip()先頭および末尾の空白を削除します。

于 2010-01-16T15:46:05.843 に答える
44

完全を期すために、次のものも使用できます。

mystring = mystring.strip()  # the while loop will leave a trailing space, 
                  # so the trailing whitespace must be dealt with
                  # before or after the while loop
while '  ' in mystring:
    mystring = mystring.replace('  ', ' ')

これは、スペースが比較的少ない文字列ですばやく機能します (reこれらの状況よりも高速です)。

どのようなシナリオでも、Alex Martelli の分割/結合ソリューションは、少なくとも同程度の速度で実行されます (通常は、はるかに高速です)。

あなたの例では、timeit.Timer.repeat() のデフォルト値を使用して、次の時間を取得します。

str.replace: [1.4317800167340238, 1.4174888149192384, 1.4163512401715934]
re.sub:      [3.741931446594549,  3.8389395858970374, 3.973777672860706]
split/join:  [0.6530919432498195, 0.6252146571700905, 0.6346594329726258]


編集:

これらの方法の速度のかなり長い比較を提供するこの投稿に出くわしました.

于 2013-04-10T22:23:49.753 に答える