web-dev-qa-db-ja.com

string.whitespaceを使用してPythonの空白を削除します

Pythonのstring.whitespaceは素晴らしい:

>>> string.whitespace
'\t\n\x0b\x0c\r '

正規表現に '\ t |\n | ...などを手動で入力することなく、これを文字列で使用するにはどうすればよいですか?

たとえば、「\ n私を傷つけないでください。\ x0bを傷つけないでください。」

「私を傷つけないでください。」

おそらく、単一のスペースを保持したいのですが、string.whitespace [:-1]に移動するだけで十分です。

47
Alex

まさにこのユースケースのための特別なケースのショートカットがあります!

引数なしでstr.splitを呼び出すと、単一文字ではなく空白の実行で分割されます。そう:

>>> ' '.join("Please \n don't \t hurt \x0b me.".split())
"Please don't hurt me."
144
bobince

\s文字クラスの何が問題になっていますか?

>>> import re

>>> pattern = re.compile(r'\s+')
>>> re.sub(pattern, ' ', "Please \n don't \t hurt \x0b me.")
"Please don't hurt me."
13
Imran

いくつかの合理的な仮定をしてみましょう。

(1)空白文字の実行を単一のスペース(実​​行の長さは1以上)で置き換える必要があります。

(2)Python 2.XでUnicodeオブジェクトを使用して、最小限の変更で同じコードを動作させたい場合。

(3)ドキュメントで保証されていないことをコードに仮定させたくない

(4)Python 3.X strオブジェクトを使用して、最小限の変更で同じコードを動作させたい場合。

現在選択されている回答には、次の問題があります。

(a)_" " * 3_を_" " * 2_に変更します。つまり、重複スペースを削除しますが、3重、4重などのスペースは削除しません。 [要件1に失敗]

(b)_"foo\tbar\tzot"_を_"foobarzot"_に変更[要件1に失敗]

(c)ユニコードオブジェクトを入力すると、TypeError: translate() takes exactly one argument (2 given)を取得します[要件2に失敗します]

(d)_string.whitespace[:-1]_を使用します[要件3に失敗します。 string.whitespaceの文字の順序は保証されません]

(e)_string.whitespace[:-1]_を使用[要件4に失敗。 in Python 2.X、string.whitespace is _'\t\n\x0b\x0c\r '_ ;; in Python 3.X、それは '\ t\n\r\x0b\x0c ']

" ".join(s.split())回答とre.sub(r"\s+", " ", s)回答にはこれらの問題はありません。

9
John Machin

Translateメソッドを使用できます

import string

s = "Please \n don't \t hurt \x0b me."
s = s.translate(None, string.whitespace[:-1]) # python 2.6 and up
s = s.translate(string.maketrans('',''), string.whitespace[:-1]) # python 2.5, dunno further down
>>> s
"Please  don't  hurt  me."

そして、重複する空白を削除します

s.replace('  ', ' ')
>>> s
"Please don't hurt me."
2
Tor Valamo

開始点..(ホワイトスペースサーカスを手動で組み立てるよりも短くはありませんが).

>>> from string import whitespace as ws
>>> import re

>>> p = re.compile('(%s)' % ('|'.join([c for c in ws])))
>>> s = "Please \n don't \t hurt \x0b me."

>>> p.sub('', s)
"Pleasedon'thurtme."

または、空白を最大1つに減らしたい場合:

>>> p1 = re.compile('(%s)' % ('|'.join([c for c in ws if not c == ' '])))
>>> p2 = re.compile(' +')
>>> s = "Please \n don't \t hurt \x0b me."

>>> p2.sub(' ', p1.sub('', s))
"Please don't hurt me."

3番目の方法、よりコンパクト:

>>> import string

>>> s = "Please \n don't \t hurt \x0b me."
>>> s.translate(None, string.whitespace[])
"Pleasedon'thurtme."

>>> s.translate(None, string.whitespace[:5])
"Please  don't  hurt  me."

>>> ' '.join(s.translate(None, string.whitespace[:5]).split())
"Please don't hurt me."
1
miku