文字列はPythonシーケンスのうちのひとつ。シーケンスは、順序付けられたオブジェクトです。
シーケンス型は長さ(length)を調べる・添字(index)を利用する・スライス(slicint)することが可能です。
たとえば文字列'Python'の長さは6、'Python'[0]は'P'、'Python'[1:4]は'yth'となります。
Pythonの文字列はイミュータブル(immutable)です。イミュータブルとは、日本語で「不変」です。
逆はミュータブル(mutable)で、日本語で「変更可能な」という意味です。
つまりPythonの文字列はすぐに変更可能なわけではないということです。Python以外の言語とは異なる特徴でもあります。
文字列はシングルクォートかダブルクォートでくくります。3個のシングルクォート(''')や3個のダブルクォート(""")でくくることもでき、トリプルクォートは複数行で記述したいときに使われます。print文ではシングルクォート、ダブルクォート、トリプルクォートは取り除かれたかたちで出力されます。
シングルクォート、ダブルクォート、トリプルクォート
>>> a = 'abc' >>> print(a) abc >>> a = "abcdef" >>> print(a) abcdef >>> type(b) <class 'str'> >>> a = '''python ... carnival''' >>> print(a) python carnival >>> b = """Python ... Carnival""" >>> print(b) Python Carnival >>> type(b) <class 'str'>
空文字列
中身が空っぽの、空文字列もある。出力結果は空欄となる
>>> a = '' >>> print(a) >>> b = "" >>> print(b) (空行となる)
新しい文字列を作る時に空文字列は必要となる
>>> c = 'Carnival' >>> p = '' >>> p += 'Python ' >>> p += c >>> print(p) Python Carnival
たとえば、使ったことのない変数にいきなり+=することはできない
>>> hajimemashite += 'Hello Python' Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'hajimemashite' is not defined
str()関数で文字列へ変換
str()関数を使うと、文字列に変換
>>> a = 10 >>> str(a) '10' >>> b = a >>> b 10 >>> b = str(a) >>> b '10' >>> a = str(a) >>> a '10'
\によるエスケープ
\nは改行。
>>> sample_sentense = 'Python \nCarnival' >>> print(sample_sentense) Python Carnival
文字列内のシングルクォート、ダブルクォート・バックスラッシュの表現も\を使う
>>> sample1 = 'The English word \"science\" comes from the Latin scientia, meaning \'knowledge\'.' >>> print(sample1) The English word "science" comes from the Latin scientia, meaning 'knowledge'. >>> sample2 = 'This is backslash:\\.' >>> print(sample2) This is backslash:\.
+で連結、*で繰り返し
>>> a = 'Python' >>> b = ' Carnival' >>> a + b 'Python Carnival' >>> c = a + b >>> print(c) Python Carnival >>> a * 3 'PythonPythonPython' >>> d = b * 5 >>> print(d) Carnival Carnival Carnival Carnival Carnival
len()で文字列の長さを取得。for文で一文字ずつ取り出し
文字列以外のシーケンス型でも同様にできる。
>>> site = 'PythonCarnival' >>> len(site) 14 >>> for c in site:print(c) ... P y t h o n C a r n i v a l
[]によるインデクシング、文字の抽出
>>> site = 'PythonCarnival' >>> site[0] 'P' >>> site[1] 'y' >>> site[-1] 'l' >>> site[-2] 'a' >>> site[13] 'l' >>> site[20] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: string index out of range
文字列はイミュータブル。変更にはreplace()やスライスを利用
冒頭でも言いましたが、文字列はイミュータブルなので直接編集できません。
文字列変更の際にはreplace()や[start:end:step]スライスを使うことになります。
>>> site = 'PythonCarnival' >>> site[0] = 'C' #例外発生。直接編集不可 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment >>> site.replace('P', 'C') 'CythonCarnival' >>> 'C' + site[1:] 'CythonCarnival'
[start:end:step]によるスライスを使いこなしましょう
>>> site = 'PythonCarnival' >>> for i in range(len(site)): ... #'PythonCarnival'のオフセットを確認。f-stringsで文字列フォーマット ... print(f'{i}:{site[i]}') ... 0:P 1:y 2:t 3:h 4:o 5:n 6:C 7:a 8:r 9:n 10:i 11:v 12:a 13:l >>> site[:] #文字列全体を指定 'PythonCarnival' >>> site[6:] #オフセット6から末尾まで 'Carnival' >>> site[2:7] #オフセット2から6まで。オフセット7は含まないことに注意 'thonC' >>> site[-2:] #末尾の2文字 'al' >>> site[8:-3] #8文字目から、末尾より3文字手前までを切り取る 'rni' >>> site[8:3] #無効。この記法では8文字目から3文字目まで切り取れない '' >>> site[-6:-2] #末尾の6文字手前から末尾の2文字手前まで切り取る 'rniv' >>> site[::3] #先頭から末尾まで3文字ごとに取り出す 'PhCna' >>> site[1:10:2] #オフセット1から9まで2文字ごとに取り出す 'yhnan' >>> site[4::3] #オフセット4から末尾まで3文字ごとに取り出す 'oail' >>> site[:12:4] #先頭からオフセット11まで4文字ごとに取り出す 'Por' >>> site[-1::-1] #逆にステップしてすべて 'lavinraCnohtyP' >>> site[::-1] #上と同様 'lavinraCnohtyP' >>> site[-20:] #例外は発生しない。末尾の20文字手前から末尾まで取り出す 'PythonCarnival' >>> site[-21:-20] #末尾の21文字手前から末尾の20文字手前まで。 '' >>> site[100:] #オフセット100から末尾まで取り出す '' >>> site[:100] #先頭からオフセット99まで取り出す 'PythonCarnival' >>> site[50:51] #オフセット50からオフセット50まで取り出す ''
split()による分割
>>> animals = 'cat,dog,elephant' >>> animals.split(',') #カンマ(,)を基準に区切ってリストにする ['cat', 'dog', 'elephant'] >>> animals_list = animals.split(',') >>> type(animals_list) <class 'list'>
join()による結合,多くの文字列の結合に有効
split()の逆がjoin()
さきほどのanimals_listを使う
>>> new_string = ''.join(animals_list) #空の文字列で要素をつなぐ >>> new_string 'catdogelephant' >>> new_string2 = ':'.join(animals_list) #コロン(:)で要素をつなぐ >>> new_string2 'cat:dog:elephant' # つなげたい文字列の集まりをリスト化して、join()で結合 >>> my_strings = ['aaaaaa', 'bbbbbb','ccc','dddd'] >>> chunks = [] >>> for s in my_strings: ... chunks.append(s) ... >>> result = ''.join(chunks) >>> result 'aaaaaabbbbbbcccdddd'
最初の文字を大文字、残りを小文字に
>>> 'python'.capitalize() 'Python' >>> 'pyThon'.capitalize() 'Python'
文字列を小文字に/文字列を大文字に
>>> 'Python'.lower() 'python' >>> 'PYTHON'.lower() 'python' >>> 'python'.upper() 'PYTHON' >>> 'Python'.upper() 'PYTHON'