このページでは、Pythonの文字列の基本的な操作を網羅してまとめています。
Python(特にPython3以降)の文字列操作は、複雑な処理でも、他のプログラミング言語よりも簡単に実行できるようになっています。そのための基本的な操作をしっかりと身につけましょう。
なお、ここでの内容はPython 3をメインとしたものとなっていますが、Python2とPython3で特に異なるものに関しては、別途解説を入れています。
1. 文字列の基本知識
まず「文字列」とは何かについて理解しておきましょう。
1.1. 文字列はシーケンス
文字列とは、シンプルに、文字が特定の順番に連なっているもののことです。別名、「ストリング(string)」や「テキスト(text)」ともいいます。
例えば、”study”という単語は、アルファベットの ‘s’, ‘t’, ‘u’, ‘d’, ‘y’ の 5 つの文字が「特定の順番に連なって」いますので文字列です。同じ 5 つのアルファベットを使っても、”study” と “dusty” は、文字の並びが違うので別の文字列です。
このように「ある要素が特定の順番に連なっているもの」を「シーケンス」といいます。シーケンスは、プログラミングでよく出てくる言葉なので、この機会に覚えておくと良いでしょう。
文字列は単語に限りません。例えば “this is a pen.” のような文も、文字(空白含む)が特定の順番に連なってできている文字列(シーケンス)です。
プログラミング初学者にとっては、のっけから聞きなれない言葉のオンパレードで、不安に感じるかもしれません。ご安心ください。これらは最初からはっきりと理解できていなくても全く問題ありません。コードを書いているうちに自然と理解できるようになっていきます。
1.2. 文字列はイミュータブル(変更不可能)
文字列には、「イミュータビリティ(immutability)」といって、「一度文字列を作ったら、その後に、その文字列の一部を変更するようなことはできない」という特徴があります。この特徴のため、文字列は「イミュータブルなオブジェクト」といいます。繰り返しとなりますが、「オブジェクト」とは、データ(文字列の場合は文字)とメソッドを持っているもののことです。
それでは文字列のイミュータビリティについて詳しく解説します。まずは、以下の文字列をご覧下さい。
''' 変数strに文字列を代入します。'''
str = 'Hello World!'
print(str)
‘str’ という名前の文字列変数(=文字列型オブジェクト)を作りました。変数 ‘str’ には、’Hello World!’ という文字列が格納されています。なお変数については「Pythonの変数定義の方法と命名規則」をご確認ください。
次に、この文字列の一部である ‘Hello’ を ‘Good Morning’ に変更しようとしてみます。
''' 変数strの一部を変更しようとするとエラーになります。 '''
str[0:5] = 'Good Morning'
「str[0:5] 」と書いています。これは、「文字列の抽出(スライス)」といって、変数 ‘str’ に格納された文字列の、0番目(一番最初)から4番目の要素を抽出することを指示しています。
“Hello World.” という文字列の0番から4番目の要素は ‘Hello’ です。式は、「str[0:5] = ‘Good Morning’」となっていますので、つまり、’Hello’ を ‘Good Morning’ に置き換えるという意味になっています。
文字列のスライスについては、この後、解説していますので、そちらで改めてご確認ください。
ここでしっかりと覚えて頂きたいのは、既に作った文字列の一部を、後で変更しようとしても、できない(エラーになる)ということです。これが「イミュータブル」ということの意味です。
ただし、以下のように、同じ変数 ‘str’ に新しい別の文字列を代入して、上書きすることはできます。これは「文字列の一部変更」には当てはまらないからです。
''' 文字列変数の上書きは可能です。 '''
str = 'Good Morning World!'
print(str)
Pythonでは、文字列やタプルはイミュータブル(変更不可能)です。一方で、リストなどはミュータブル(変更可能)です。この点は、最初はよくわからなくてもコードを書いたり、メソッドを使っていくうちに理解できるようになっていきます。
最初は、「文字列はイミュータブルである」ということをしっかり頭に入れておきましょう。
2. 文字列の作り方
それでは、ここから文字列の基本操作について一つずつ解説していきます。まずは文字列の作り方からです。
Pythonで文字列を作るには、文字をシングルクオート( ‘ )か、ダブルクオート( ” )を使います。
''' クオートで囲った文字や数字が文字列 '''
print('文字列') # シングルクオートで囲っても文字列。
print("文字列") # ダブルクオートで囲っても文字列。
print('this is a string.') # アルファベットも文字列。
print("10") # 数値もクオートで囲っている場合は文字列。
シングルクオート、ダブルクオートはどちらでも構いません。しかし、シングルクオートの場合は次のようにバッティングが起こるとエラーになります。
''' クオートの使い方に関する注意点'''
'I'm good at programming.' # シングルクオートとアポストロフィがバッティングしている。
このエラーの原因は、文字列を囲むシングルクオート( ‘ )と、”I’m” の中のアポストロフィ( ‘ )が重複しているところにあります。
こういうときは、次のようにダブルクオートを使います。
print("I'm good at programming.")
文字列を変数に代入するには、左辺に変数名を書き、=演算子で繋ぎ、右辺に代入する文字列を書きます。
''' =演算子で文字列を変数に代入する。 '''
str1 = 'これは文字列です。'
str2 = "This is a string."
print(str1)
print(str2)
変数とは何かと、その基礎については以下の記事で解説しています。
なお、データとメソッドを持っているもののことを「オブジェクト」といいます。そして、文字列データを持っているオブジェクトのことを「文字列型オブジェクト」と言います。つまり、上記コードの変数str1とstr2は文字列型オブジェクトです。
なおメソッドとは、データを加工する機能のことです。これから沢山出てきます。Pythonの全てのデータは何らかのメソッドを持っていますので、全てのデータはオブジェクトと言えます。
3. 文字列の操作
さて、文字列の作り方はわかりましたね。ここからは文字列の簡単な操作方法を解説します。
3.1. 文字列の抽出(スライス)
文字列の要素の一部を取り出すことを「スライス」と言います。次のように書くと文字列をスライスすることができます。
''' 文字列のスライス '''
text = '私は妻の作るラザニアが大好物です。'
print(text[2]) # インデックス番号2番の要素。
print(text[:6]) # インデックス番号6番までの要素。
print(text[6:]) # インデックス番号6番以降の要素。
print(text[6:10]) # インデックス番号6〜9番の要素。
この文字列の各文字は、それぞれ次のようにインデックス番号が振られた上で変数 ‘text’ に格納されています。
インデックス番号2番は「妻」、インデックス番号6番までは「私は妻の作る」、インデックス番号6番から10番までは「ラザニア」がそれぞれ該当しますので、その要素がスライスされています。
なおご覧のように、スライスでは、開始位置は指定の番号から、終了位置はn-1の番号まで抽出します。次のページでさらに詳しく解説していますので、ぜひ確認してみてください。
3.2. 文字列の繰り返し(*演算子)
*演算子を使えば、その文字列を繰り返して表示することができます。
''' 文字列の繰り返しは*演算子を使う'''
str = 'はい'
print(str)
print(str*2) # 2回繰り返し
print(str*3) # 3回繰り返し
3.3. 文字列の大文字化(upperメソッド)
英字を大文字化したい時はupperメソッドを使います。
''' upperメソッドで英字文字列を大文字化。 '''
str = 'this is a string.'
print(str.upper())
3.4. 文字列の小文字化(lowerメソッド)
英字を小文字化したい時はlowerメソッドを使います。
''' lowerメソッドで英字文字列を小文字化。 '''
str = 'THIS IS A STRING'
print(str.lower())
3.5. 文字列の長さを調べる(len関数)【Python2 vs. Python3】
文字列の長さを調べるにはlen関数を使います。
''' len関数で文字列の長さを調べる。 '''
str1 = 'これは文字列です。'
str2 = 'this is a string.'
print(len(str1))
print(len(str2))
なお、Python2とPython3ではlen関数の挙動が大きく異なります。
Python3では、以下のように半角、全角問わず1文字としてカウントされます。
text1 = "How long is this text?"
print(len(text1))
text2 = "この文字列の長さは?"
print(len(text2))
text3 = "この文字列の長さはhow long?"
print(len(text3))
しかしPython2では次のように半角英数字は1文字、全角日本語は2文字としてカウントされます。
text1 = "How long is this text?"
print len(text1)
text2 = "この文字列の長さは"
print len(text2)
text3 = "この文字列の長さはhow long?"
print len(text3)
この点を頭に入れておきましょう。
なお、以下のページでは、Python2でPython3のように半角全角問わず1文字としてカウントする方法や、Python3でPython2のように半角1文字全角2文字としてカウントする方法を解説しています。
4. 文字列の連結・結合・埋め込み
続いて、個別の複数の文字列を連結・結合する方法と、ある文字列の中に別の文字列を埋め込む方法を見ていきましょう。
4.1. +, +=演算子
まずは文字列を連結・結合する方法です。これは、文字列同士を+演算子でつなぐことで可能です。
str1 = '山田'
str2 = 'さん'
str3 = str1+str2 # ←文字列を+で連結
print(str3)
連結する文字列はいくつでも問題ありません。
''' 文字列はいくつでも連結することができます。 '''
str1 = '山田'
str2 = 'さん'
str3 = 'アップルパイが'
str4 = 'すき'
str5 = str1+str2+str3+str4
print(str5)
+=演算子では、文字列が連結された上で左辺の文字列が上書きされます。
''' +=演算子では左辺の文字列が上書きされます。 '''
str1 = '山田さん'
str2 = 'アップルパイが好き'
str1 += str2
print(str1)
文字列の連結については、以下のページでより詳しく解説しています。
なお文字列と数値を連結しようとするとエラーになってしまいます。その時は、str関数で数値を文字列に変換したり、int関数で文字列を数値に変換したりする必要があります。それについては以下のページで解説しています。
それでは、次に文字列の中に別の文字列を埋め込む方法を見ていきましょう。
ある文字列の中に、別のデータ(文字列、値、リスト、タプル、辞書など)を埋め込む方法はいくつか用意されています。
- formatメソッド
- fプリフィクス
- printf形式
この中でもっともよく使われているのはformatメソッドでしょう。fプリフィクスはPython3.6以降で実装されてformatメソッドよりも、さらに良い書き方です。
printf形式はPython2でよく使われていたものですが、使いやすさの点でも処理の点でも劣ります。しかしPython3でも目にする時があると思いますので見ておきましょう。
4.2. formatメソッド【Python3以降】
format()はPython3から実装されたメソッドです。それまでのprintf形式と比べて、
- 表記がシンプルで覚えるのが楽
- 処理の負荷が軽い
というメリットがあります。次のように使います。
''' formatメソッドを使うと文字列に別の値を埋め込むことができます。 '''
text = '{}は{}です。'
print(text.format('犬', '人間の友'))
これ以外にも様々な文字列操作や数値操作を行うことができます。以下のページで確認しておきましょう。
4.3. f文字列【Python3.6以降】
Python3.6からはf文字列という、formatメソッドよりもさらに簡潔なコードになり、さらに負荷が少ない記法が使えるようになりました。これがもっとも「Pythonらしい」書き方なので、ぜひマスターしておきましょう。
次のように書きます。
''' Python3.6からはfプリフィクスという方法が使えるようになりました。 '''
title = 'Greatest Showman'
like = '好き'
text = f'私は{title}という映画が{like}です。'
print(text)
fプリフィクスの書き方はformatメソッドと非常によく似ています。formatメソッドを使いこなせるようになったら、自然とfプリフィクスも書けるようになります。
4.4. printf形式【python2】
printf形式はPython2でよく使われていました。Python3以降でも使えますが、formatメソッドやfプリフィクスの方が機能的なので、特に使いこなせるようになる必要はありません。
しかしPython2で書かれたプログラムを処理しなければいけない機会はあると思うのでここで確認しておきましょう。
''' Python2系では%記法というものがよく使われていました。 '''
str1 = '姉'
str2 = '弟'
age1 = 10
age2 = 8
text = '%sは%d才で%sは%d才です。'
print(text %(str1, age1, str2, age2))
このようにprintf形式では埋め込む値の型によって、次の指定子を書かなければいけません。
- %s – 文字列を埋め込む
- %d – 整数を埋め込む
- %f – 浮動小数点を埋め込む
formatメソッドやfプリフィクスと比べると、コードが簡潔ではありませんね。
5. 文字列の検索
文字列の検索にはfindメソッドやcountメソッドを使います。
5.1. findメソッド
findメソッドは、指定の文字列の位置をインデックス番号で返してくれます。見つからない場合は-1を返します。
''' findメソッドは指定の文字を前から検索します。'''
text = '新聞紙うえから読んでもしたから読んでも新聞紙'
print(text.find('新聞紙'))
rfindメソッドは、指定の文字列を後ろから探して、その位置を返してくれます。
''' rfindメソッドは指定の文字を後ろから検索します。'''
text = '新聞紙うえから読んでもしたから読んでも新聞紙'
print(text.rfind('新聞紙'))
詳しくは以下のページで解説しています。
5.2. countメソッド
該当する文字がいくつ存在するかを知りたい時はcountメソッドを使います。
''' countメソッドは指定の文字の個数を返します。'''
text = '新聞紙うえから読んでもしたから読んでも新聞紙'
print(text.count('新聞紙'))
これも以下のページでより詳しく解説しています。
5.3. in文
in 文は、指定の文字列が存在するかどうかをブール値(True or False)で返します。
''' in文では部分一致する文字列があるかどうかを返す。 '''
str1 = 'これは文字列です。'
str2 = 'これも文字列です。'
print('文字列です' in str1)
print('文字列です' in str2)
print('これは' in str1)
print('これは' in str2)
6. 文字列の削除
文字列を削除するには主にstripメソッドを使います。stripメソッド以外の方法は次の記事で解説していますので、あわせてご確認ください。
6.1. stripメソッド・rstripメソッド・lstripメソッド
両端にある不要な文字列の削除にはstripメソッドを使います。
例えば、以下の文字列は両端に不要な空白や改行コード(\n)がありますね。stripメソッドでは、このような不要な文字列を一度に削除することができます。なお改行については「Pythonの文字列の改行方法」をご覧ください。
''' stripメソッドは両端の不要な文字列を削除します。 '''
str = ' これは文字列です。 \n' # 両端に不要な空白と改行コードがある。
print(str.strip())
stripメソッドはデフォルト(引数が空白の時)では、
- 空白
- 改行\n
- タブ\t
- 垂直タブ\v
- 復帰\r
- 改ページ\f
を自動で削除してくれます。これ以外の文字を削除したい場合は、第一引数で指定します。
''' 削除する文字は指定することができます。 '''
str = ',,++これは文字列です。--,,' # 両端にいくつかの不要な文字がある。
print(str.strip(',')) # カンマを削除
print(str.strip(',+')) # カンマと+を削除
print(str.strip(',+-')) # カンマと+と-を削除
lstripとrstripは、それぞれ左端からと右端から不要な文字列を削除します。
''' lstrip()とrstrip() '''
str = '+++これは文字列です。+++'
print(str.lstrip('+')) # lstrip()は左端の不要な文字列を削除
print(str.rstrip('+')) # rstrip()は右端の不要な文字列を削除
なおstripメソッドについては、以下のページでさらに詳しく解説しています。
7. 文字列の置換
文字列の置換には、主にreplaceメソッドとtranslateメソッドを使います。以下のページでは、その他の方法も詳しく解説していますのであわせてご確認ください。
7.1. replaceメソッド
文字列の置換にはreplaceメソッドを使います。第一引数に置換したい文字列、第二引数に新しい文字列を指定します。
''' 文字列を置換するにはreplace() '''
str = '私はPythonが好きです。'
print(str)
print(str.replace('Python', 'Java'))
第三引数では置換回数を指定することができます。
''' replace()の置換回数を指定する。 '''
str = 'PythonとRubyとJavaとCとPerlとPHP'
print(str.replace('と', ', ', 1)) # 1回置換
print(str.replace('と', ', ', 3)) # 2回置換
print(str.replace('と', ', ', 5)) # 3回置換
それぞれ指定回数置換されていますね。
replaceメソッドについては以下のページでより詳しく解説しています。
7.2. translateメソッド
置換したい文字が一文字で、入れ替えたい新しい文字も一文字であれば、translateメソッドで複数の一文字を一度に置換することができます。
translageメソッドで置換する文字列と新しい文字列を指定する時は、str.maketrans()を併用します。str.maketrans()の引数に置換する文字列と新しい文字列を辞書型で渡します。
''' 複数の一文字を一度に置換するにはtranslate() '''
text = 'これは,不自然あな文字列です.\t'
print(text)
# translate()で、「,」を「、」に「あ」を「」に、「.」を「。」に「\t」を「」に一度に置換
print(text.translate(str.maketrans({
',' : '、',
'あ' : '',
'.' : '。',
'\t' : '',
})))
次のように、第一引数に置換する文字列、第二引数に新しく入れ替える文字列、第三引数に削除する文字列を渡す書き方もあります。
''' この書き方でも可能です。 '''
print(text.translate(str.maketrans(',.', '、。', 'あ\t')))
translateメソッドによる文字列削除では、置換する文字列も新しい文字列も一文字(=長さ1)である必要があるという点を覚えておきましょう。これも、「Pythonの文字列を削除する方法」でより詳しく解説しています。
8. 文字列の分割
文字列を分割するには、splitメソッドやsplitlinesメソッドが用意されています。それぞれ見ていきましょう。
なお以下のページではさらに詳しく解説しています。あわせてご確認ください。
8.1. splitメソッド・rsplitメソッド
splitメソッドは、文字列を分割してリスト型で返すメソッドです。デフォルトでは空白区切りで文字列を分割します。
''' splitメソッドはデフォルトでは空白区切りで文字列を分割します。 '''
str = 'apple banana cherry durian figs'
print(str.split())
返り値はリスト型になっていることも確認しましょう。デフォルト以外の区切り文字で分割したい場合は第一引数で指定します。次のコードでは、読点(、)区切りで分割しています。
''' 指定の文字で区切るには第一引数で区切り文字を指定します。 '''
str = 'りんご、バナナ、チェリー、ドリアン、いちじく'
# 読点(、)区切りで分割します。
print(str.split('、'))
第二引数では分割回数を指定することができます。次のコードでは2回分割しているので、’りんご’と、’バナナ’、そして’チェリー、ドリアン、いちじく’の3つに分割されています。
''' 第二引数で分割回数を指定することができます。 '''
str = 'りんご、バナナ、チェリー、ドリアン、いちじく'
# 2回分割
print(str.split('、', 2))
splitメソッドと同じようなものにrsplitメソッドがあります。これは文字列を後ろから分割するもので、分割回数を指定した場合のみ違いがあります。
''' rsplitメソッドは後ろから分割します。分割回数を指定した場合のみ違いがあります。 '''
str = 'りんご、バナナ、チェリー、ドリアン、いちじく'
# rsplitメソッドで分割
print(str.rsplit('、', 2))
# splitメソッドで分割
print(str.split('、', 2))
rsplitメソッドでは’りんご、バナナ、チェリー’と、’ドリアン’、’いちじく’の3つに分割されています。一方でsplitメソッドでは’りんご’と、’バナナ’、そして’チェリー、ドリアン、いちじく’の3つに分割されています。
''' splielinesメソッドは改行コード区切りで分割します。 '''
str = 'りんご\nバナナ\nチェリー\nドリアン\nいちじく\n'
print(str.splitlines())
なおsplitメソッドでリスト型で分割された文字列は、以下のように、それぞれ別の変数に代入することができます。分割結果を代入した場合、その変数の型は文字列型です。
''' 分割結果を一度に複数の変数に代入することができます。 '''
str = 'りんご、バナナ、チェリー、ドリアン、いちじく'
# この場合、それぞれ文字列型で代入されます。
a,b,c = str.split('、', 2)
print(a)
print(b)
print(c)
print(type(a))
以下のページでsplitメソッドについて、さらに詳しく解説していますので、ぜひご確認ください。
8.2. splitlinesメソッド
splitメソッドはデフォルトでは空白区切で分割しますが、splitlinesメソッドは改行コードで分割します。splitメソッドで分割した場合との違いは、文字列の末尾にも改行コードがある場合に見られます。
以下のコードをご覧ください。
''' split()とsplitlines()では末尾に改行コードがある場合に違いがあります。 '''
str = '1 apple\n2 banana\n3 cherry\n'
print(str.split('\n')) # ←末尾に空の要素ができる。
print(str.splitlines()) # ←末尾に空の要素はできない。
splitメソッドでは末尾に空の要素が作成されるのに対して、splitlinesメソッドでは空の要素はできません。「Pythonの文字列を分割する方法」では、splitメソッドとsplitlinesメソッドの違いをさらに詳しく解説しています。
9. 文字列の比較
条件に該当するかしないかによって別々の処理を行うような時は、よく文字列比較と組み合わせて書きます。ここでは、もっとも基本的な==演算子、と!=演算子を使った比較方法を見ていきましょう。
なお、次のページでは、さらに細かい方法を解説していますので、あわせてご確認ください。
9.1. ==演算子
文字列を完全一致で比較するには、==演算子を使います。返り値はブール値です。完全一致する場合にはTrueを、完全一致しない場合にはFalseを返します。
''' ==演算子は完全一致かどうかを返す。 '''
str1 = 'これは文字列です。'
str2 = 'これは文字列です。'
str3 = 'これも文字列です。'
print(str1==str2) # 完全一致
print(str1==str3) # 完全一致ではない
9.2. !=演算子
!=演算子は、==演算子と真逆で、完全一致でない場合にTrueを返し、完全一致の場合にFalseを返します。
''' !=演算子は完全一致でないかどうかを返す。 '''
str1 = 'これは文字列です。'
str2 = 'これは文字列です。'
str3 = 'これも文字列です。'
print(str1!=str2) # 完全一致
print(str1!=str3) # 完全一致ではない
10. 別のオブジェクトを文字列に変換する
最後に、別のオブジェクト(数値、リスト、タプル、辞書、集合)を文字列型オブジェクトに変換する方法を解説します。
10.1. 数値を文字列に変換(str関数)
数値を文字列に変換するにはstr関数を使います。
''' str関数で数値を文字列に変換します。 '''
num = 100
print(str(num))
print(type(str(num)))
数値が文字列型になっていることが確認できますね。もちろん、文字列に変換する数値は浮動小数点でも構いません。
''' 浮動小数点もそのまま文字列化します。 '''
num = 70.25
print(str(num))
print(type(str(num)))
通常、数値と文字列を連結しようとするとエラーになりますが、str関数で数値を文字列に変換しておくと、次のように連結することができます。
''' 数値を文字列化すると文字列と連結することができます。 '''
text = '点は満点です。'
num = 100
print(str(num) + text)
「Pythonの数値と文字列を変換する方法」もご確認ください。
10.2. イテラブルの要素を連結して文字列に変換(joinメソッド)
イテラブルとは、値を順番に取り出すことができるデータのことです。初心者のうちはシンプルに、リスト、タプル、辞書、集合のことだと理解しておきましょう。
イテラブルを文字列に変換するには、joinメソッドを使います。詳しくは以下の記事で解説しているので、ここでは例を見ていきましょう。
リストを連結して文字列に変換
joinメソッドは次のようにリストの要素を、指定の区切り文字で連結します。
''' リストを連結して文字列に変換。 '''
list = ['a', 'b', 'c']
print(','.join(list))
print(type(','.join(list)))
タプルを連結して文字列に変換
タプルもリストと全く同じように連結します。
''' タプルを連結して文字列に変換。 '''
tuple = ('りんご', 'バナナ', 'チェリー')
print('と'.join(tuple))
print(type('と'.join(tuple)))
辞書を連結して文字列に変換
辞書の場合は、キーのみ、そしてキーが文字列の場合のみ連結することができます。
''' 辞書のキーを連結して文字列に変換。 '''
dict = {'りんご':1, 'バナナ':5, 'チェリー':3}
print('と'.join(dict))
print(type('と'.join(dict)))
集合を連結して文字列に変換
集合もリストやタプルと同じように連結することができます。
''' 集合を連結して文字列に変換。 '''
set = {'mac user', 'windows user'}
print(' or '.join(set))
print(type(' or '.join(set)))
まとめ
Python の文字列の基本について解説しました。文字列操作は、プログラミングを学ぶ上で、数値演算と並んで、最初の一歩です。
まず、Pythonの文字列操作の基礎知識として次の2点をおさえておきましょう。
- Pythonの文字列は、文字が特定の順番に連鎖している「シーケンス」である。
- Pythonの文字列はイミュータブルである。
そして、まずはここで解説している文字列操作を、しっかりと使いこなせるようになっておきましょう。
コメント