【Python】文字列の扱い方をまとめてみる
2019/08/15
Python学習第4弾。
今回は文字列についてまとめておきたいと思います。
Pythonの文字列
1. 文字列の基本的な作り方
1-1. print関数でそのまま表示
Pythonで文字列を作るには、文字列をシングルクォーテーション(')か、ダブルクォーテーション(")で囲みます。
具体的には以下のように記述します。
1 2 3 4 5 |
print('nodoame.net') # シングルクォート print("nodoame.net") # ダブルクォート print('日本語もOK') # 日本語でも問題なし print('I am a Cat.') # アルファベット、半角スペースも問題なし print('45') # 数字もクォートで囲まれている場合は、文字列として出力されます |
↑ str_01.pyとして保存して実行してみます
1 |
python str_01.py |
↑ pythonの実行例
nodoame.net
日本語もOK
I am a Cat.
45
↑ 実行結果
↑ 実際に実行した結果のキャプチャ
1-2. シングルクォーテーションを重ねるとエラー
シングルクォート、ダブルクォートはどちらでも文字列は作ることができますが、シングルクォートの場合は文字列中にシングルクォートを使用することで、エラーが発生します。
PHPでもよくあるやつですね。
1 |
print('I'm a Cat.') |
↑ このように、シングルクォート中でシングルクォートを使うと。。。
1 2 3 4 |
File "str_02.py", line 1 print('I'm a Cat.') ^ SyntaxError: invalid syntax |
↑ エラーが起きます
↑ 見事にエラー
解決方法。
こういうときは潔くダブルクォーテーションを使うか、エスケープ文字のバックスラッシュ(キーボードの右上の方にある¥マーク)を使ます。
1 2 |
print("I'm a Cat.") # ダブルクォート print('I\'m a Cat.') # エスケープ文字を使用 |
I'm a Cat.
↑ エラーは起きません
1-3. 変数に文字列を代入する
1 2 3 4 5 |
str1 = '文字列文字列文字列' str2 = 'This is a pen.' print(str1) print(str2) |
↑ str_04.py
This is a pen.
1-4. 三重引用符
複数行に渡って文字列を記述したい場合は、クォート文字を3つ続ける「三重引用符」を使って書く方法があります。
PHPでいうところの、ヒアドキュメントのような扱いなのでしょうか?
1 2 3 4 5 6 7 |
str5 = ''' 広島 阪神 巨人 ''' print(str5) |
↑ str_05.py
1 2 3 |
広島 阪神 巨人 |
広島、阪神、巨人が改行されて表示されましたが、広島の上、巨人の下が改行されて「空行」が入っています。
これを防ぐために、Pythonでは、三重引用符の直後にバックスラッシュ(キーボードの右上の方にある¥マーク)を書いて、改行しないようにするという手法がよくとられるとのことです。
1 2 3 4 5 6 7 8 |
# 三重引用符で行頭と行末に空行を入れない工夫 str6 = '''\ 広島 阪神 巨人\ ''' print(str6) |
↑ str_06.py
1 2 3 |
広島 阪神 巨人 |
↑ 空行がなくなりました
2. 文字列の連結
2-1. 「+」で単純に連結する
文字列の連結は 『+』 を使います。Javascriptと同じような感覚です。
1 2 3 4 5 |
str1 = 'Dragon' str2 = 'Quest' str3 = str1 + str2 # ←文字列を+で連結 print(str3) |
↑ str_02_1.py
1 |
DragonQuest |
↑ str_02_1.pyの結果
↑ 結果のキャプチャ
2-2. 「+=」で追記する
1 2 3 4 5 |
str = 'StarWars' str += ' Episode IV' str += ' 新たなる希望' print(str) |
↑ str_02_2.py
1 |
StarWars Episode IV 新たなる希望 |
↑ str_02_2.pyの結果
↑ 結果のキャプチャ
2-3. 「*」で指定回数分繰り返す
1 2 3 |
str = 'オラ!' * 4 print(str) |
↑ str_02_3.py
1 |
オラ!オラ!オラ!オラ! |
↑ str_02_3.pyの結果
↑ 結果のキャプチャ
3. 文字列へ変換
数値を文字列に変換(str関数)
1 2 |
kion = 36 print('今日の気温は' + kion + '度です') |
↑ str_03_1.py
1 2 3 4 5 |
toogie:03_str toogie$ python3 str_03_1.py Traceback (most recent call last): File "str_03_1.py", line 2, in <module> print('今日の気温は' + kion + '度です') TypeError: can only concatenate str (not "int") to str |
↑ str_03_1.pyの結果
↑ 結果のキャプチャ
テキストと数値を混ぜた文章を作成し表示させようとしますが、エラーとなります。
これはPHPでは出ないエラーですね。
エラーメッセージには『TypeError: can only concatenate str (not "int") to str』とあり、直訳すると『strはstrとしか結合できません』となり、翻訳すると『strとintは結合できません』となる感じでしょうか。
ちなみにconcatenateは「結合るする、連結する」という意味の英単語です。
ということで、数値を文字列に変換するstr関数の出番です。
1 2 |
kion = 36 print('今日の気温は' + str(kion) + '度です') |
print関数のkion変数に、str変数を当てながら実行すると。。。
1 |
今日の気温は36度です |
↑ 今度は問題なく表示されました
↑ 結果のキャプチャ
4. 文字列の置換
replaceメソッド
文字列の置換にはreplaceメソッドを使用します。
replace()の第一引数に検索する文字列、第二引数に新しい文字列を指定します。
1 2 |
str = 'Jonathan Joestar' print(str.replace('Jonathan', 'Joseph')) |
1 |
Joseph Joestar |
↑ 無事、ジョナサンがジョセフに変換されました
↑ 結果のキャプチャ
なお、replaceは関数ではなく、メソッドと呼ばれます。
関数とメソッドの違いは使い方、呼び出し方が、『第一引数に自分を呼び出したオブジェクトを代入するか、しないか』という違いがあり、変数や値の後にドット(.)を付けて呼び出します。
より単純にまとめると、
- 単独で呼び出しできるのが「関数」(≒ オブジェクトを代入しない)
- 変数や値に付けて呼び出すのが「メソッド」(≒ オブジェクトを代入する)
となります。
上の例でもstr変数にドットでつないでreplaceを使用する形となっています。
5. 文字列の分割
splitメソッド
文字列の分割はsplitメソッドを使用します。
spritメソッドは特定の区切り文字を指定して文字列を区切ることができ、戻り値は「リスト(list)」という形で返します。なお、区切り文字のデフォルトは空白文字となります。
1 2 3 |
# 「-」で区切る例 str = 'Jonathan-Joseph-Jotaro-Josuke-Giorno' print(str.split('-')) |
1 |
['Jonathan', 'Joseph', 'Jotaro', 'Josuke', 'Giorno'] |
↑ 結果はリスト形式で返されました(見た感じ、JSのオブジェクトとよく似ていますね)
↑ 結果のキャプチャ
spritメソッドの第二引数では分割回数を指定することができます。
次のコードでは2回分割しているので、’Jonathan’と、’Joseph’、’Jotaro-Josuke-Giorno’の3つに分割されます。
1 2 3 |
str = 'Jonathan-Joseph-Jotaro-Josuke-Giorno' # 2回分割 print(str.split('-',2)) |
1 |
['Jonathan', 'Joseph', 'Jotaro-Josuke-Giorno'] |
↑ 結果
↑ 結果のキャプチャ
6. 文字列の桁揃え
rjustメソッド
文字列の左に値を埋める場合はrjustメソッドを使います。
rjust()の第一引数が埋めた後の桁数、第二引数が埋め込む文字列です。
ゼロ以外の文字列も埋め込み可能です。
1 2 3 4 5 6 7 |
str = '1234' # 0で10桁揃え(ゼロパディング) print(str.rjust(10, '0')) # 任意の文字(Z)で10桁揃え print(str.rjust(10, 'Z')) |
zfillメソッド
特定の文字列を指定せずゼロで桁埋めする場合はzfillメソッドを使います。
1 2 3 4 |
str = '1234' # 0で8桁揃え(ゼロパディング) print(str.zfill(8)) |
7. 文字列の検索
7.1 findメソッド / rfindメソッド
findメソッドは指定の文字列の位置をインデックス番号で返します。
見つからない場合は-1を返します。
インデックス番号とは0から始まる、文字の位置番号と考えてもらって問題ありません。
findメソッド
1 2 |
str = 'LinuxApacheMySQLPHP' print(str.find('Linux')) |
1 |
0 |
↑ 前から検索していくので、先頭ということで「0」が返ります。
Linux という「文字のかたまり」を検索対象として指定しているので、それがあたった番号を返します。
1 2 |
str = 'LinuxApacheMySQLPHP' print(str.find('Apache')) |
1 |
5 |
↑ 同じ文字列で Apache を検索対象文字とした場合は「5」が返ります。
1 2 |
str = 'abcabc' print(str.find('b')) |
1 |
1 |
↑もっと単純な文字列にして、対象文字を検索。左から参照していくので、1が返ります
rfindメソッド
rfindメソッドは、指定の文字列を後ろ(右端)から探してその位置(インデックス番号)を返します。
インデックス番号は、左端からの位置を返します。
1 2 |
str = 'abcabc' print(str.rfind('b')) |
1 |
4 |
↑ 2回めの「b」を検索し、左端からのインデックス番号である4が返ります
7.2 countメソッド
該当する文字がいくつ存在するかを知りたい時はcountメソッドを使います。
1 2 |
str = 'かえるぴょこぴょこみぴょこぴょこあわせてぴょこぴょこむぴょこぴょこ' print(str.count('ぴょこ')) |
1 |
8 |
↑ 日本語でも問題ありません。
早口言葉で有名な語句の中から「ぴょこ」の個数をカウントすると8が返ります。
1 2 |
str = 'かえるぴょこぴょこみぴょこぴょこあわせてぴょこぴょこむぴょこぴょこ' print(str.count('かえる')) |
1 |
1 |
↑ 1個しかない語句を対象とすると、ちゃんと1が返ります
7.3 in文
指定の文字列が存在するかどうかをブール値(True or False)で返します。
1 2 |
str = 'LinuxApacheMySQLPHP' print('PHP' in str) |
1 |
True |
↑ 含まれる文字だとTrueが返ります
1 2 |
str = 'LinuxApacheMySQLPHP' print('Python' in str) |
1 |
False |
↑ 含まれない文字だとFalseが返ります
8. 大文字・小文字変換
指定の文字列を大文字・小文字へ変換するにはupperメソッドもしくはlowerメソッドを使います。
読んで字のごとく、upperメソッドで大文字、lowerメソッドで小文字化します。
1 2 3 4 |
str = 'Jonathan JOESTAR' print(str.upper()) print(str.lower()) |
1 2 |
JONATHAN JOESTAR jonathan joestar |
9. 先頭・末尾の削除
stripメソッド・lstripメソッド・rstripメソッド
両端にある不要な文字列の削除にはstripメソッドを使います。
lstripメソッドは先頭文字(左)、rstripは末尾文字(右)にあるものを削除します。
引数で消したい文字を指定することができ、引数を指定しない場合は空白を除去します。
1 2 3 |
# 左の空白文字を削除する lstrip_str = ' Joseph Joestar' print(lstrip_str.lstrip()) |
1 |
Joseph Joestar |
↑ 空白が削除されました
1 2 3 |
# 右の空白文字を削除する rstrip_str = 'Kujo Jotaro ' print(rstrip_str.lstrip()) |
1 |
Kujo Jotaro |
↑ (わかりにくいですが)空白が削除されました
1 2 3 |
# 左右の空白文字を削除する strip_str = ' Higashikata Josuke ' print(strip_str.strip()) |
1 |
Higashikata Josuke |
↑ 文字列の前後にある空白が削除されました
1 2 3 |
# 削除する文字を引数で指定する strip_str = 'Jonathan Joestar' print(strip_str.strip('Jo')) |
1 |
nathan Joestar |
↑ 左端の「Jo」が削除された結果が返ります