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

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

ただいまの
回答率

87.60%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 6,424

score 55

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

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

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

>>> a = 'www.example.com'
>>>
>>> a.lstrip('cmowz')
'.example.com'
>>> a.rstrip('cmowz')
'www.example.'
>>>
>>> a.lstrip('cmowz').rstrip('cmowz')
'.example.'
>>> a.rstrip('cmowz').lstrip('cmowz')   # 順序は関係ない
'.example.'
>>> a.strip('cmowz')
'.example.'

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

>>> a = 'I want to go to okinawa'
>>> a.replace('w', '')
'I ant to go to okinaa'
>>>
>>> a.replace('aw', '')
'I want to go to okina'

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/15 22:51

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

    キャンセル

  • 2019/01/15 22:53

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

    キャンセル

  • 2019/01/15 23:06

    > 先頭から'cmowz'以外の文字に当たるまで消去し続けるので.example,comになる
    という理解で大丈夫でしょうか?

    'www.example.com'.lstrip('cmowz') が '.example.com' を返す理由についてはそのとおりです。

    キャンセル

+2

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

がミソ。

a = 'abcdefa'
s = a.strip('abc') # => def
# 先頭からabcまでは引数の文字列に含まれるので削除。次がdで引数に含まれていないから一旦終わり。次に末尾を見るがfはabcに含まれないのでそこで終わり

a = 'I want to go to okinawa'
s = a.strip('w') # => I want to go to okinawa
# 先頭を見てIなので先頭側は終わり。末尾を見てaなので終わり

a = 'I want to go to okinawa'
s = a.strip('wa') # => I want to go to okin
# 先頭側は同じだが、末尾側はnに達するまではstripする

'www.example.com'.strip('cmowz') # => .example.
# 先頭・末尾どちらもドットで止まる

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/15 22:59

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

    キャンセル

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

  • ただいまの回答率 87.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る