dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

[python]strip()の引数を省略すると空白だけでなく改行も除去される

文字列の先頭と末尾から指定した文字を除去する strip([chars]) というメソッド。
これ、引数を指定しないと空白文字を除去するというのを今日知りました。

# 引数指定
>>> 'www.example.com'.strip('cmowz.')
'example'

# 引数なし
>>> '     www.example.com    '.strip()
'www.example.com'

公式ドキュメントによると

http://docs.python.jp/2/library/stdtypes.html?highlight=strip#str.strip

文字列の先頭および末尾部分を除去したコピーを返します。引数 chars は除去される文字集合を指定する文字列です。 chars が省略されるか None の場合、空白文字が除去されます。 chars 文字列は接頭語でも接尾語でもなく、そこに含まれる文字の組み合わせ全てがはぎ取られます。

というわけで文字列の前後の半角スペースを除去するのかーぐらいで捉えてたんですが
改行も除去してくれることがわかり

>>> print '\nhello'

hello
# \nも除去される
>>> print '\nhello'.strip()
hello

改行とは書かれていないのになんで?と気になったので
"python 空白文字" で調べてみるとこちらの公式ドキュメントが見つかりました。

http://docs.python.jp/2/library/string.html#string.whitespace

空白 (whitespace) として扱われる文字全てを含む文字列です。ほとんどのシステムでは、これはスペース (space)、タブ (tab)、改行 (linefeed)、復帰 (return)、改頁 (formfeed)、垂直タブ (vertical tab) です。

つまり、引数なし strip() が除去するのは "空白" でなく "空白文字" だから、というわけ。

ためしに、

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

とすると \n とか \r が含まれているのが確認できました。
\x0b\x0c は垂直タブ(\v)や改頁(\f)の16進数表記っぽい)

リファレンス

strip()split() について非常に詳しく説明されています
http://infra-engineer.com/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/python%E5%88%9D%E5%AD%A6%E8%80%85%E3%81%AB%E8%B4%88%E3%82%8Bpython%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E5%88%86%E6%9E%90%EF%BC%88strip%E3%81%A8%E3%81%8Bsplit%E3%81%A8%E3%81%8Bitemgetter%E3%81%A8/

"空白文字" について、こちらにも書かれてました
はてなグループの終了日を2020年1月31日(金)に決定しました - はてなの告知

改行コードについて
pythonにおける改行コード、改めて調べてまとめてみた。多分pythonだけじゃないけど。--listen2the Silence