質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

5762閲覧

.strip()で文字列を消去できない

gunmed

総合スコア55

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

1クリップ

投稿2019/01/15 13:34

strip()を使えるようにしたい

strip()を練習しようと思い、みんなのpython3版とpython公式を読みました。

まず、みんなのpython3版を読んで、stripは文字列の先頭から末尾全体に対し、''で挟んだ文字列を削除すると理解しました。
以下のようにコードを書き、実行しました。

a = 'abcdefa' s = a.strip('abc') print(s)

結果

def

となり、自分の中でstrip('abc')というのは文字列の中でabcという配列を削除するのではなく、a,b,c,を個別的にすべて削除するんだと理解しました。しかし、以下のコードを実行して、もちろんwのみがすべて削除されるのかと思いきや、

a = 'I want to go to okinawa' s = a.strip('w') print(s)

結果

I want to go to okinawa

なにも削除されませんでした。
次にstrip('wa')と変更してファイルを実行すると

###結果

I want to go to okin

となぜかokinawaのawaが消えました。しかもwantのwaは消えてません。

ここで頭が混乱したのですが、python公式を読みました。
イメージ説明

と書いてありました。
ここで疑問が生じます。
当初の理解ではstrip('abc')とすると文字列全体のうちa、b、cという配列を削除すると思ってたのに、
この例ではstrip('cmowz)で文字列 'www.example.com'を消去すると
.exaple.になるはずなのに.examle.とmが残ってしまっています。実際visual studio codeで試しましたが、mは残りました。

以上のように、strip()について理解が難しく勘違いをしていると思うので、strip()について、上記の問題を解決しながら丁寧に教えていただけると幸いです。

補足情報(FW/ツールのバージョンなど)

mac 10.14.1
visual studio code

dice142👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

文字列の最も外側の先頭及び末尾からというのがミソです。

つまり、a.strip('wa') は a.lstrip('wa').rstrip('wa') と同じです。
まず片側から特定の文字を削って、次に反対側から削るのです。

Python

1>>> a = 'www.example.com' 2>>> 3>>> a.lstrip('cmowz') 4'.example.com' 5>>> a.rstrip('cmowz') 6'www.example.' 7>>> 8>>> a.lstrip('cmowz').rstrip('cmowz') 9'.example.' 10>>> a.rstrip('cmowz').lstrip('cmowz') # 順序は関係ない 11'.example.' 12>>> a.strip('cmowz') 13'.example.'

なお、特定の文字を削除したい場合は str.replace が使えます。

Python

1>>> a = 'I want to go to okinawa' 2>>> a.replace('w', '') 3'I ant to go to okinaa' 4>>> 5>>> a.replace('aw', '') 6'I want to go to okina'

引数の解釈がstrip系の関数とは少し違うので注意が必要です。

  • strip系は、あくまで文字の集まりとして引数を解釈します。
  • その他多くの関数は、順序ある文字列として解釈します。

strip系の引数が集合型なら多くの誤解は防がれるのに、としばしば思います。

投稿2019/01/15 13:38

編集2019/01/15 13:47
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gunmed

2019/01/15 13:51

回答ありがとうございます。 少し考えてやっと理解したと思います。 つまり、 www.example.com を先頭から'cmowz'以外の文字に当たるまで消去し続けるので.example,comになる という理解で大丈夫でしょうか? さっきのI want to go to okinawaも'w'だと先頭も末尾もwではないからその時点で消去は終了して何も変化がなかったということですかね。
gunmed

2019/01/15 13:53

今ページをリロードしたので、追加の編集も今見させていただきました。とてもわかりやすいです。
LouiS0616

2019/01/15 14:06

> 先頭から'cmowz'以外の文字に当たるまで消去し続けるので.example,comになる という理解で大丈夫でしょうか? 'www.example.com'.lstrip('cmowz') が '.example.com' を返す理由についてはそのとおりです。
guest

0

文字列の先頭からcharsの文字集合に含まれない文字に達するまで、文字が削除されます。文字列の末尾に対しても同様の操作が行われます。

がミソ。

python

1a = 'abcdefa' 2s = a.strip('abc') # => def 3# 先頭からabcまでは引数の文字列に含まれるので削除。次がdで引数に含まれていないから一旦終わり。次に末尾を見るがfはabcに含まれないのでそこで終わり 4 5a = 'I want to go to okinawa' 6s = a.strip('w') # => I want to go to okinawa 7# 先頭を見てIなので先頭側は終わり。末尾を見てaなので終わり 8 9a = 'I want to go to okinawa' 10s = a.strip('wa') # => I want to go to okin 11# 先頭側は同じだが、末尾側はnに達するまではstripする 12 13'www.example.com'.strip('cmowz') # => .example. 14# 先頭・末尾どちらもドットで止まる

投稿2019/01/15 13:54

編集2019/01/15 14:07
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gunmed

2019/01/15 13:59

回答ありがとうございます。 とても明快な回答でとても理解が深まりました。 もう一人の方も丁寧な回答をしてくださり、すでにベストアンサーにしてしまっているので、その点は申し訳ありません。 また、よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問