🔙
🔝

文字列の操作を使いこなす機能一覧

Chatpter.1 - 文字列とリストとの違い

文字列の特徴

  • 文字列は '" で囲われた文字列が1つの値になります。

  • リストのほうは「要素」が0個以上の集まりになっていて、「要素の値」を書き換えることが出来ます。

  • 文字列は、値の一部分だけを指定して書き換えることはできません。


  • 文字列の一部分を書き換えようとすると・・・

    name = '天使のぼる'  # 誰?
    name[3] = 'え'  # 'ぼ' を 'え' に書き換える
    print(name)
    
    Traceback (most recent call last):
      File "Main.py", line 2, in <module>
        name[3] = 'え'  # 'ぼ' を 'え' に書き換える
    TypeError: 'str' object does not support item assignment
    

    リストと同じやり方で書き換えようとしてもエラーが出てしまいます。

  • 一部分を書き換える代わりに、変数の値をまるごと更新します。

    name = '天使のぼる'
    name = '天使のえる'  # 値をまるごと新しくする
    print(name)
    
    天使のえる

  • どうしてもリストみたいに値の一部分だけを書き換えたい場合、Chatpter.5 の中の「文字列の一部分だけを書き換える」でそのやり方を紹介します。

  • また、特定の文字を別の文字にゴッソリ書き換えたい時などは「Chatpter.2 - メソッド」の .replace() で書き換えることも出来ます。

  • しかし、文字列はリストのような柔軟さはありません。

  • 必ず決まったルールの下で扱うことになります。

  • リストよりも単純に見えて、何かしようとすると制限が多くて扱いにくいのが文字列の難点です。

Chatpter.2 - メソッド

メソッドとは

  • int()print() みたいな関数の「文字列型 (str) 専用版」です。

  • 変数.メソッド のような書き方をして使います。

  • リスト型と違って、文字列型のメソッドは関数と同じ形で、最後は値に化けます。

  • なので、変数に代入して使うことになります。

    メソッド ( ) の中身 機能 なかったら
    文字 ( ) 内の文字がいくつあるかを数える 0
    文字 ( ) 内の文字がある位置の位置番号を取得する。 -1
    文字 find() は左から、rfind() は右から調べる -1
    文字 find() と 同じ エラー
    文字 rfind() と 同じ エラー
    文字 ( ) 内のアルファベットを、全部小文字にする 変化なし
    文字 ( ) 内のアルファベットを、全部大文字にする 変化なし
    現文字, 新文字 現文字を新文字に全て置き換える 変化なし
    文字 ( ) 内の文字の所で左から区切って、リストに変換する ['']
    文字 ( ) 内の文字の所で右から区切って、リストに変換する ['']
    リスト リストの要素を区切り文字を使って接続し、文字列型に変換する。

    ※ 文字列型 (str) のメソッドは他にもいろいろあります。憶えるのが大変!
    ※ リストと違って「要素」ではなく「位置」という言葉に置き換えてますが、同じように考えて大丈夫です。

【 コラム 】 - 「位置」についての追加説明

「位置」について

  • 要素の場合は、その中の値がどんなに大きな数であっても、どんなに長い文字列であっても「1つの要素」です。

    [0, float('inf'), '黒猫', '俺の美コードがこんなに見にくいわけがない']

    → 要素(値)は4つ

    リストの「要素」は、そのリストの中の「左から何要素目」と1要素(値)ずつ数えます。

  • 文字列の場合は、どんなに長い文字列であっても「1つの値」です。

    '寿限無寿限無五劫の擦り切れ回砂利水魚の・・・'

    → 22文字だけど、値は1つ

    文字列の「位置」は、その値の中の「左から何文字目」と、0文字目から1文字ずつ数えます。

  • 前回の Chatpter.5 でも触れましたが、

    words = ['絶対', '運命', '黙示録']
    

    の場合、リストは '絶対' '運命' '黙示録' で、要素数は「3」です。
    それぞれの要素の値の文字数は、「2(文字)」「2(文字)」「3(文字)」です。

  • 要素0 の、左から 0番目の位置の文字は となります。words[0][0]

    要素2 の、左から 1番目の位置の文字は となります。words[2][1]

  • でも考え方は、要素でも位置でも「左から何番目」ということです。

  • 要素、位置のどちらの添字も [0] というように [ ] 書きで書かれます。

  • なのでリストの場合の「要素」を、文字列の場合の「位置」という言葉に置き換えても添字の書き方は同じで、やり方も同じということになります。

.count()

.count(引数)

  • 引数の文字が文字列にいくつあるかを数えます。

    title = 'ボベボーバ・ボーブビ'
    
    cnt = title.count('ボ')
    print(cnt)
    
    cnt = 3       # 'ボ' が3個見つかった
    print(cnt)
    
    3
    何度も実行して、動きを確認してみてください!

    試しにいろいろいじくりまわしてみましょう!
    めちゃくちゃになって戻せなくなってしまったら、そっと『閉じる』を押しましょう。😹

.find() .rfind()

.find(引数)

  • 引数の文字列がある位置の先頭の位置番号に化けます。

  • 複数ある場合は、左から探して最初に見つかった位置の位置番号に化けます。

    title = 'Re:ゼロから始めるfind検索'
    
    idx = title.find('find')
    print(idx)
    
    idx = 10      # find の 'f' の位置の位置番号に化ける
    print(idx)
    
    10

  • 検索文字が複数含まれている時

    title = 'find:ゼロから始めるfind検索'
    
    idx = title.find('find')
    print(idx)
    
    idx = 0    # 左の find がヒットする
    print(idx)
    
    0

  • 見つからなかった時

    idx = title.find('イチ')
    print(idx)
    
    idx = -1
    print(idx)
    
    -1

    実際に動かして見てみよう!

.rfind(引数)

  • 引数の文字列がある位置の先頭の位置番号に化けます。

  • 複数ある場合は、から探して最初に見つかった位置の位置番号に化けます。

  • 右から探しても、引数の文字列の先頭の位置が位置番号となって化けます。

    title = 'Re:シリから始めるfind検索'
    
    idx = title.rfind('find')
    print(idx)
    
    idx = 10     # 位置番号なので find() の時と位置は同じ
    print(idx)
    
    10'f' の位置の位置番号

    検索文字が複数含まれている時

    title = 'rfind:シリから始めるfind検索'
    
    idx = title.rfind('find')
    print(idx)
    
    idx = 13    # 右の find がヒットする
    print(idx)
    
    13

    見つからなかった時

    title = 'Re:シリから始めるfind検索'
    
    idx = title.rfind('ゼロ')
    print(idx)
    
    idx = -1
    print(idx)
    
    -1

    実際に動かして見てみよう!
  • リスト型には .find() .rfind() は存在しません。ご注意を。

.index() .rindex()

.index(引数)

  • 引数の文字が文字列から見つからなかった時、

  • 化ける値が -1 になるのが .find() .rfind()

    エラーになるのが .index() .rindex()

  • となること以外は同じです。

  • エラーメッセージはこんな感じで出てきます。

    title = '魔法少女プリティセガ'
    idx = title.index('サミー')
    print(idx)
    
    Traceback (most recent call last):
      File "Main.py", line 2, in <module>
        idx = title.index('サミー')
    ValueError: substring not found
    
    怒られてみよう!ω・)
  • 一方、リスト型にはなぜか .index() しかありません。
    .rindex() は存在しませんので、ご注意を。

.lower() .upper()

.lower()

  • 文字列に含まれるアルファベットを、全て小文字にします。

  • アルファベットなら全角文字でも特殊文字でも大文字から小文字に変換します。

    text = 'AAÀあア'
    text_lowered = text.lower()
    print(text)
    print(text_lowered)
    
    text = 'AAÀあア'
    text_lowered = 'aaàあア'   # 全て小文字になって化けてから変数に代入
    print(text)
    print(text_lowered)
    
    AAÀあア← 元の文字列は変わらない aaàあア← 日本語には影響がない
    打ち込んでみよう!

.upper()

  • 文字列に含まれるアルファベットを、全て大文字にします。

  • アルファベットなら全角文字でも特殊文字でも小文字から大文字に変換します。

    text = 'aaàぁァ'
    text_uppered = text.upper()
    print(text)
    print(text_uppered)
    
    text = 'aaàぁァ'
    text_uppered = 'AAÀぁァ'   # 全て大文字になって化けてから変数に代入
    print(text)
    print(text_uppered)
    
    aaàぁァ← 元の文字列は変わらない AAÀぁァ← 日本語には影響がない
    打ち込んでみよう!
.replace()

.replace(引数1, 引数2)

  • 引数1の文字列を、引数2置き換えます。(置換 = replace)

    title = 'ちょっとごめんねずこ'
    title_replaced = title.replace('ねずこ', 'ねこ')
    print(title_replaced)
    
    title = 'ちょっとごめんねずこ'
    title_replaced = 'ちょっとごめんねこ'   # 'ねずこ' が 'ねこ' に置き換わる
    print(title_replaced)
    
    ちょっとごめんねこ

  • 置き換えられる文字が複数ある時は、全部まとめて一括変換します。

    text = 'The government of the people, by the people, for the people.'
    text_replaced = text.replace('people', 'cats')
    print(text_replaced)
    
    text = 'The government of the people, by the people, for the people.'
    text_replaced = 'The government of the cats, by the cats, for the cats.'
    print(text_replaced)
    
    The government of the cats, by the cats, for the cats.

.split() .rsplit()

.split(引数, maxsplit=区切りを入れる個数)

  • 引数の「区切り文字」を境に、文字列をリスト型に分割します。

  • 引数を省略すると、区切り文字が半角スペース ' ' となります。

  • 意味がよくわからないと思いますので、実際に変化を見てみてください。

    text = 'mouse cow cat rabbit dragon snake'
    texts = text.split()
    print(texts)
    
    text = 'mouse cow cat rabbit dragon snake'
    texts = ['mouse', 'cow', 'cat', 'rabbit', 'dragon', 'snake']
    print(texts)
    
    ['mouse', 'cow', 'cat', 'rabbit', 'dragon', 'snake']

  • 区切り文字を指定するときは、引数に区切り文字を入れます。

    text = 'mouse,cow,cat,rabbit,dragon,snake'
    texts = text.split(',')
    print(texts)
    
    text = 'mouse,cow,cat,rabbit,dragon,snake'
    texts = ['mouse', 'cow', 'cat', 'rabbit', 'dragon', 'snake']
    print(texts)
    
    ['mouse', 'cow', 'cat', 'rabbit', 'dragon', 'snake']

  • maxsplit= で、区切りを入れる個数を指定できます。

    text = 'mouse,cow,cat,rabbit,dragon,snake'
    texts = text.split(',', maxsplit=2)
    print(texts)
    
    ↓ 区切る回数が2回
    text = 'mouse,cow,cat,rabbit,dragon,snake'
    texts = ['mouse', 'cow', 'cat,rabbit,dragon,snake']
    print(texts)
    
    ['mouse', 'cow', 'cat,rabbit,dragon,snake']

    maxsplit= の数値を変えてみてください!

.rsplit(引数, maxsplit=区切りを入れる個数)

  • .split()右から版です。

    text = 'mouse cow cat rabbit dragon snake'
    texts = text.rsplit(maxsplit=2)
    print(texts)
    
    text = 'mouse cow cat rabbit dragon snake'
    texts = ['mouse cow cat rabbit', 'dragon', 'snake']
    print(texts)
    
    ['mouse cow cat rabbit', 'dragon', 'snake']

  • maxsplit= を省略すると、.split() と同じ結果になります。

    maxsplit= の数値を変えてみてください!

.join()

'区切り文字'.join(引数)

  • 区切り文字を使って、リストの要素を接続し、文字列に変換します。

  • 要素と要素の間に区切り文字が付きます。

    lst = ['mouse', 'cow', 'cat', 'rabbit', 'dragon', 'snake']
    text = ','.join(lst)
    print(text)
    
    lst = ['mouse', 'cow', 'cat', 'rabbit', 'dragon', 'snake']
    text = 'mouse,cow,cat,rabbit,dragon,snake'
    print(texts)
    
    mouse,cow,cat,rabbit,dragon,snake

  • 区切り文字は文字列なので、何文字でも区切り文字に使えます。

    lst = ['mouse', 'cow', 'cat', 'rabbit', 'dragon', 'snake']
    text = '-+-'.join(lst)
    print(text)
    
    lst = ['mouse', 'cow', 'cat', 'rabbit', 'dragon', 'snake']
    text = 'mouse-+-cow-+-cat-+-rabbit-+-dragon-+-snake'
    print(text)
    
    mouse-+-cow-+-cat-+-rabbit-+-dragon-+-snake

  • 区切り文字を '' にすると、要素が連結します。(結構使います)

    lst = ['こめと', 'いもの', 'ふつうの', '暮らし']
    text = ''.join(lst)
    print(text)
    
    lst = ['こめと', 'いもの', 'ふつうの', '暮らし']
    text = 'こめといものふつうの暮らし'
    print(text)
    
    こめといものふつうの暮らし
Chatpter.3 - 関数

文字列型で使える関数は・・・

  • 文字列の操作はほとんどの場合、メソッドのほうを使います。

  • 文字列を関数の引数にして何か色々するということはそんなに多くありません。

  • そのぶん、メソッドの機能のほうをたくさん憶えましょう!

  • () の中身は、今回は文字列型変数が入ります。

    関数 機能 戻り値の型
    文字列の文字数を数える int
    文字列をリストに変換します list
len()

len(引数)

  • 文字列の文字数を数えます。(length)

    word = 'ラーメン大好き小沼さん'
    
    word_len = len(words)
    print(word_len)
    
    word_len = len('ラーメン大好き小沼さん')
    print(word_len)
    
    word_len = 11    # 文字数は 11
    print(word_len)
    
    11
    打ち込んでみよう!
list()

list(引数)

  • 文字列をリストに変換します。

    title = 'ゆるばら'
    
    listed_title = list(title)
    print(listed_title)
    
    listed_title = list('ゆるばら')
    print(listed_title)
    
    listed_title = ['ゆ', 'る', 'ば', 'ら']
    print(listed_title)
    
    ['ゆ', 'る', 'ば', 'ら']

    文字列を一文字ずつ要素に分割してくれます。


  • もし分割して欲しくない、['ゆるばら']として欲しい!という時にはこうする方法があります。

    最も簡単な方法

    title = 'ゆるばら'
    
    listed_title = [title]
    print(listed_title)
    
    ['ゆるばら']

    .append() を使う方法

    title = 'ゆるばら'
    
    listed_title = []
    listed_title.append(title)
    
    print(listed_title)
    
    ['ゆるばら']

    いろんなパターンを試してみよう!
    打ち込んでみよう!
Chatpter.4 - in

in

  • 文字列の中身に特定の値が含まれているかを判定する in という機能があります。

  • 含まれていたら True 、含まれていなかったら False に化けます。

  • リスト型と使い方は全く同じです。

    title = 'スレイヤーズ TEXT'
    

    含まれる時

    if 'イヤー' in title:
    
    if True:    # 'イヤー' が見つかったので True に化けた
    

    含まれない時

    if 'デイ' in title:
    
    if False:    # 'デイ' が見つからなかったので False に化けた
    
  • もちろん andor も使えます。

    title = 'スレイヤーズ TEXT'
    

    or

    if 'スレイヤーズ' or 'NEXT' in title:    # 'スレイヤーズ' か 'NEXT' のどちらかある?
    
    if True:     # 'NEXT' は無いけど 'スレイヤーズ' は見つかったので True に化けた
    

    and

    if 'スレイヤーズ' and 'NEXT' in title:    # 'スレイヤーズ' と 'NEXT' の両方ある?
    
    if False:    # 'スレイヤーズ' はあったけど 'NEXT' はなかったよ
    
  • 基本はやっぱり変数を使って探します。

    title = 'スレイヤーズ TEXT'
    
    word = 'イヤー'
    if word in title:
    
    word = 'イヤー'
    if True:
    
  • リスト型と文字列型は似て異なるものです。

  • でも関数やメソッドの使い方が同じだったり、使えそうで使えなかったりするので混乱します。

  • 使えないと思ったら実は使えたなんてこともありますので、思い込まずに使えるかどうかすぐにちょっと試してみましょう。

Chatpter.5 - 小ワザ集

教わるまでもないちょいテク

文字列の一部分だけを書き換える

文字列の一部分だけを書き換える

  • スライスで切り取って、間に文字列を入れる方法。

    name = '天使のぼる'
    name = name[:3] + 'え' + name[4:]
    print(name)
    
    name = '天使のぼる'
    name = '天使の' + 'え' + 'る'  # 化けるとこんな風
    print(name)
    
    天使のえる
  • 位置3 の所をよけて、位置3 の所に 'え' を入れて + で繋げています。

文字列の前後を入れ替える

文字列の前後を入れ替える

  • スライスで切り取って、まるごと場所を入れ替えるだけです。

    title = 'こっちそっち'
    title = title[3:] + title[:3]
    print(title)
    
    title = 'こっちそっち'
    title = 'そっち' + 'こっち'  # 化けるとこんな風
    print(title)
    
    そっちこっち