Pythonのstring.whitespaceは素晴らしい:
>>> string.whitespace
'\t\n\x0b\x0c\r '
正規表現に '\ t |\n | ...などを手動で入力することなく、これを文字列で使用するにはどうすればよいですか?
たとえば、「\ n私を傷つけないでください。\ x0bを傷つけないでください。」
に
「私を傷つけないでください。」
おそらく、単一のスペースを保持したいのですが、string.whitespace [:-1]に移動するだけで十分です。
まさにこのユースケースのための特別なケースのショートカットがあります!
引数なしでstr.split
を呼び出すと、単一文字ではなく空白の実行で分割されます。そう:
>>> ' '.join("Please \n don't \t hurt \x0b me.".split())
"Please don't hurt me."
\s
文字クラスの何が問題になっていますか?
>>> import re
>>> pattern = re.compile(r'\s+')
>>> re.sub(pattern, ' ', "Please \n don't \t hurt \x0b me.")
"Please don't hurt me."
いくつかの合理的な仮定をしてみましょう。
(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)
回答にはこれらの問題はありません。
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."
開始点..(ホワイトスペースサーカスを手動で組み立てるよりも短くはありませんが).
>>> 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."