そまちょブログのそまちょ(@somachob)です。
この記事では、Pythonの文字列について解説していきます。
文字列の基本
文字列の宣言
文字列は「’(シングルクォーテーション)」または「”(ダブルクォーテーション)」で囲みます。「#」はコメントを表します。
print('Hello, World!') # => Hello, World!
# "(ダブルクォーテーション)でも宣言できる
print("Python") # => Python
# 変数に代入
a = 'こんにちは'
print(a) # => こんにちは
文字列の中に「’(シングルクォーテーション)」を入れたいときには「”(ダブルクォーテーション)」で囲みます。
逆に「”(ダブルクォーテーション)」を入れたいときには「’(シングルクォーテーション)」で囲みます。
print('I'm sorry.') # => これはエラーになります
# "(ダブルクォーテーション)で囲みます
print("I'm happy.") # => I'm happy.
# " を表示したいときは '(シングルクォーテーション)で囲みます
print('これは"重要"です!') # => これは"重要"です!
str() を使うことで、整数などを文字列に変換することができます。type() はオブジェクトの型を確認します。
a = 100
print(type(a)) # => <class 'int'>
b = str(100)
print(type(b)) # => <class 'str'>
# 変数から変換することもできる
c = str(a)
print(type(c)) # => <class 'str'>
print(type(a)) # => <class 'int'>
エスケープシーケンス
「\(バックスラッシュ)」を使えば改行文字やシングルクォーテーションをエスケープすることができます。
- \’ :シングルクォーテーション
- \” :ダブルクォーテーション
- \\ :バックスラッシュ
- \n :行送り(LF)
- \r :復帰(CR)
- \t :水平タブ(TAB)
” を3つつなげて「”””」囲ったものはドキュメンテーション文字列と呼ばれ、クラスや関数などの定義を書くのに使われます。
正確にはコメントではありませんが、「”””」で囲った部分はプログラムで実行されません。’ を3つ「”’」でも同じです。
print('シングルクォーテーション\'です') # => シングルクォーテーション'です
print('ダブルクォーテーション\"です') # => ダブルクォーテーション"です
print('バックスラッシュ\\です') # => バックスラッシュ\です
print('水平タブ(TAB)\tです') # => 水平タブ(TAB) です
print('行送り(LF)\nです')
"""実行結果
行送り(LF)
です
"""
print('復帰(CR)\rです')
"""実行結果
復帰(CR)
です
"""
文字列の結合
文字列を結合するには + を使います。
print('Hello' + ', ' + 'World') # => Hello, World
a = 'Py'
b = 'thon'
c = a + b
print(a) # => Py
print(b) # => thon
print(c) # => Python
文字列を繰り返す
文字列を繰り返すには * を使います。
print('abc' * 3) # => abcabcabc
a = 'Python' * 4
print(a) #= > PythonPythonPythonPython
b = 'hoo'
c = b * 2
print(c) # => hoohoo
文字列の文字にアクセス
インデックスを指定することで文字列の要素にアクセスすることができます。文字列の1文字目は0から始まることに注意してください。
また、最後の文字は ‐1 で取得できます。
文字列はイミュータブル(変更できない)なので書き換えようとするとエラーになります。
a = '012345'
print(a[0]) # => 0
print(a[3]) # => 3
print(a[-1]) # => 5
print(a[-2]) # => 4
b = 'Python'
print(b[0]) # => P
print(b[-1]) # => n
b[0] = 'p' # => 1文字目に p に書き換えしようとするとエラーになる
1文字ずつアクセスする
for を使うことで、1文字ずつ簡単に繰り返し処理できます。
s = 'abcde'
for c in s:
print(c)
"""実行結果
a
b
c
d
e
"""
スライス
スライスを使えば、文字列の一部を簡単に取得できます。
スライスは「:」を使います。start と stop は取得したいインデックスを指定します。
string[start:stop]
a = 'Python'
print(a[2:5]) # => tho
b = '012345'
print(b[0:2]) # => 01
print(b[4:6]) # => 45
print(b[3:5]) # => 34
print(b[3:-1]) # => 34
# 変数 c に b をスライスしたものを代入
c = b[1:5]
print(c) # => 1234
print(b) # => 012345
スライスの start と stop は省略することができます。start を省略したときは先頭に、stop を省略したときは最後になります。
a = '012345'
print(a[:3]) # => 012
print(a[3:]) # => 345
文字列を反転
スライスでは、s[i:j:k] のようにも指定できます。
s の i から j まで k 毎のスライスになります。これを使えば文字列を反転させることができます。
a = '012345'
print(a[::-1]) # => 543210
文字列の長さを取得
len() を使えば、文字列の長さを取得できます。
a = 'python'
print(len(a)) # => 6
b = '12345'
print(len(b)) # => 5
部分文字列が存在するか
in を使えば、文字列の中に部分文字列が存在するか確認できます。
a = '0123'
print('2' in a) # => True
print('8' in a) # => False
b = 'Python'
print('tho' in b) # => True
print('P' in b) # => True
print('py' in b) # => False
print('hn' in b) # => False
最大・最小の要素の取得
max() を使えば文字列の最大の要素を取得できます。min() は最小の要素を取得できます。
a = '3049821'
print(max(a)) # => 9
print(min(a)) # => 0
b = 'coadyzi'
print(max(b)) # => z
print(min(b)) # => a
c = '09azAZ'
print(max(c)) # => z
print(min(c)) # => 0
ユニコード ⇔ 文字の変換
1文字の文字のユニコードを取得するには、ord() を使います。
逆に、ユニコードから文字に変えるには、chr() を使います。
print(ord('0')) # => 48
print(ord('A')) # => 65
print(ord('a')) # => 97
print(chr(48)) # => 0
print(chr(65)) # => A
print(chr(97)) # => a
文字列のメソッド
文字列には、いろいろなメソッドが準備されています。
capitalize
capitalize() メソッドは、文字列の最初の文字を大文字にし、残りを小文字にした文字列を返します。
print('aBcD'.capitalize()) # => Abcd
# 大文字・小文字がないのでそのまま
print('0123'.capitalize()) # => 0123
a = 'python'
b = a.capitalize()
print(b) # => Python
print(a) # => python
c = 'hello, World'
print(c.capitalize()) # => Hello, world
casefold
casefold() メソッドは、大文字小文字に関係ないマッチに使えます。
小文字化の lower() と似ていますが、casefold() はドイツ語の小文字なども変換します。
print('Python'.casefold()) # => python
print('pyThoN'.casefold()) # => python
if 'Python'.casefold() == 'pyThoN'.casefold():
print('ここは実行されます')
else:
print('ここは実行されません')
print('ß'.casefold()) # => ss
print('ß'.lower()) # => ß
count
count() メソッドは、文字列の中の部分文字列が重複せず出現する回数を返します。
str.count(sub[, start[, end]])
start と end は省略可能です。指定したときは、文字列の探索する開始位置と終了位置になります。
a = 'abbcccdddd'
print(a.count('b')) # => 2
print(a.count('cc')) # => 1
print(a.count('dd')) # => 2
b = 'java, javascript, c, cpp'
print(b.count('java')) # => 2
# 4文字目から探索
print(b.count('java', 4)) # => 1
# 4文字目から6文字目まで探索
print(b.count('java', 4, 6)) # => 0
find
find() メソッドは、文字列の中の部分文字列の最初のインデックスを返します。部分文字列が含まれていないときは、-1 を返します。
str.find(sub[, start[, end]])
start と end は省略可能です。指定したときは、文字列の探索する開始位置と終了位置になります。
部分文字列が含まれるかを調べるときは in 演算子を使いましょう。
a = '012345'
print(a.find('1')) # => 1
print(a.find('1', 2)) # => -1
b = 'abcABCabc'
print(b.find('abc')) # => 0
print(b.find('abc', 2)) # => 6
print(b.find('abc', 2, 5)) # => -1
index() メソッドも同じように使えますが、見つからなかったときは -1 ではなく ValueError を返します。
str.index(sub[, start[, end]])
islower
islower() メソッドは、文字列のすべてが小文字で、かつ大小の区別のある文字が1文字以上あるときに True を返します。
print('python'.islower()) # => True
print('Python'.islower()) # => False
print('no.1'.islower()) # => True
print('No.1'.islower()) # => False
print('12345'.islower()) # => False
print('a1234'.islower()) # => True
print(''.islower()) # => False
isupper
isupper() メソッドは、文字列のすべてが大文字で、かつ大小の区別のある文字が1文字以上あるときに True を返します。
print('PYTHON'.isupper()) # => True
print('Python'.isupper()) # => False
print('NO.1'.isupper()) # => True
print('No.1'.isupper()) # => False
print('12345'.isupper()) # => False
print('A1234'.isupper()) # => True
print(''.isupper()) # => False
isalpha
isalpha() メソッドは、文字列の中のすべての文字が英字で、1文字以上あれば True を返します。
print('abcde'.isalpha()) # => True
print('aBCDe'.isalpha()) # => True
print('abc123'.isalpha()) # => False
print('ABC'.isalpha()) # => True
print('a'.isalpha()) # => True
print(''.isalpha()) # => False
isnumeric
isnumeric() メソッドは、文字列の中のすべての文字が数字で、1文字以上あれば True を返します。
print('12345'.isnumeric()) # => True
print('a1234'.isnumeric()) # => False
print('123'.isnumeric()) # => True
print('123'.isnumeric()) # => True
print('0'.isnumeric()) # => True
print(''.isnumeric()) # => False
join
join() メソッドは、引数の文字列を結合したものを返します。
str.join(iterable)
a = ['a', 'b', 'c']
b = '+'.join(a)
print(b) # => a+b+c
print(a) # => ['a', 'b', 'c']
c = ' and '.join(a)
print(c) # => a and b and c
lower
lower() メソッドは、文字列の大小の区別のある文字を小文字にして返します。
print('PYTHON'.lower()) # => python
print('Hello, Python'.lower()) # => hello, python
print('No.1'.lower()) # => no.1
print('12345'.lower()) # => 12345
print('AbC'.lower()) # => abc
print('Abc'.lower()) # => abc
a = 'PYTHON'
b = a.lower()
print(b) # => python
print(a) # => PYTHON
upper
upper() メソッドは、文字列の大小の区別のある文字を小文字にして返します。
print('python'.upper()) # => PYTHON
print('Hello, Python'.upper()) # => HELLO, PYTHON
print('No.1'.upper()) # => NO.1
print('12345'.upper()) # => 12345
print('AbC'.upper()) # => ABC
print('abc'.upper()) # => ABC
a = 'python'
b = a.upper()
print(b) # => PYTHON
print(a) # => python
replace
replace() メソッドは、文字列の中の部分文字列を置き換えたものを返します。
str.replace(old, new[, count])
old を new に置き換えます。count は省略可能で、与えられたときは先頭から count 個を置き換えます。
print('abcabc'.replace('a', 'A')) # => AbcAbc
print('JavaScript is nice.'.replace('JavaScript', 'Python')) # => Python is nice.
# 111 を A に1個だけ置き換える
print('111aaa111'.replace('111', 'A', 1)) # => Aaaa111
# 1 を 0 に2個だけ置き換える
print('111'.replace('1', '0', 2)) # => 001
a = 'abcoder'
b = a.replace('abc', 'AtC')
print(b) # => AtCoder
print(a) # => abcoder
split
split() メソッドは、文字列を分割したリストを返します。
str.split(sep=None, maxsplit=-1)
sep は区切る文字列を指定します。指定しないときは空白で区切られます。
maxsplit は区切る回数を指定します。
print('a,b,c'.split(sep=',')) # => ['a', 'b', 'c']
# + で1度だけ区切る
print('a+b+c'.split(sep='+', maxsplit=1)) # => ['a', 'b+c']
a = 'A B C'
b = a.split()
print(b) # => ['A', 'B', 'C']
print(a) # => A B C
# 空白で一度だけ区切る
print(a.split(maxsplit=1)) #= > ['A', 'B C']
swapcase
swapcase() メソッドは、大文字と小文字を入れ替えた文字列を返します。
a = 'AbcdeF'
print(a.swapcase()) # => aBCDEf
print(a) # => AbcdeF
print('09aZAz!'.swapcase()) # => 09AzaZ!
zfill
zfill() メソッドは、引数で与えた長さになるように ‘0’ で左詰めした文字列を返します。
先頭が「+」または「-」だったときは、その次から挿入されます。
print('12'.zfill(5)) # => 00012
print('+12'.zfill(5)) # => +0012
print('-12'.zfill(5)) # => -0012
print('1+2'.zfill(5)) # => 001+2
print('+-12'.zfill(5)) # => +0-12
print('-+12'.zfill(5)) # => -0+12
# 文字列が引数より多いときはそのまま
a = 'abcde'
print(a.zfill(4)) # => abcde
b = a.zfill(10)
print(b) # => 00000abcde
print(a) # => abcde
まとめ
a = '01234'
b = 'ABCdef'
print(a + b) # => 01234ABCdef
print(a * 3) # => 012340123401234
print(b[0]) # => A
print(ord(b[0])) # => 65
print(a[1:4]) # => 123
print(a[::-1]) # => 43210
print(len(a)) # => 5
print('C' in b) # => True
print(max(b)) # => f
for c in b:
print(c)
"""実行結果
A
B
C
d
e
f
"""
c = 'aBcDa'
print(c.capitalize()) # => Abcda
print(c.casefold()) # => abcda
print(c.count('a')) # => 2
print(c.find('a')) # => 0
print(c.islower()) # => False
print(c.isupper()) # => False
print(c.isalpha()) # => True
print(c.isnumeric()) # => False
print(c.join(['1', '2', '3'])) # => 1aBcDa2aBcDa3
print(c.lower()) # => abcda
print(c.upper()) # => ABCDA
print(c.replace('a', '!')) # => !BcD!
print(c.split(sep='c')) # => ['aB', 'Da']
print(c.swapcase()) # => AbCdA
print(c.zfill(10)) # => 00000aBcDa