【Python入門】文字列(String)について,Python3

文字列は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'