内容の取得
文字列長
文字列長はlen()
関数で得られる。
1 2 3 4 |
one = "first" two = "second" print(len(one), len(two)) # 5 6 |
一文字取得
配列のように文字列中の位置を指定して、一文字取得する。開始位置は0。-1で最後の文字を指定でき、そこから順に-2、-3と先頭に向けて遡る。
1 2 3 4 5 |
s = "ABCD" print(s[0], s[1], s[2]) # A B C print(s[-1], s[-2], s[-3]) # D C B |
イテレータ、リストによる連続取得
文字列はイテレータ。
1 2 3 4 |
st = "Python" for chr in st: print(chr, end=' ') # P y t h o n |
list()
関数で一文字ずつのリストが得られる。
1 2 3 |
st = "Python" print(list(st)) # ['P', 'y', 't', 'h', 'o', 'n'] |
文字の出現回数
count(sub[, start[, end]])
は元の文字列の中の部分文字列sub
の出現回数を返す。start
、end
はオプションで指定可能。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
s = "aababcabcd" print(s.count('a')) # 4 print(s.count("ab")) # 3 print(s.count('b', 1)) # 3 print(s.count('b', 1, 6)) # 2 |
部分文字列の取得(スライス)
以下の記法で部分文字列を取り出せる。ただし取り出される最後の文字列は終了位置-1
番目の文字。
1 |
[開始位置:終了位置:ステップ値] |
具体例は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
st = "0123456789" print(st[:]) # 0123456789 # 全部省略した場合は文字列全体 print(st[6:]) # 6789 # 開始位置から最後まで print(st[:4]) # 0123 # 先頭から指定位置まで(最後の文字は[指定位置-1]文字目 print(st[3:7]) # 3456 # 3文字目から6文字目まで print(st[-5:-1]) # 5678 # インデックスに負数も使えるが、開始位置:終了位置に注意 print(st[1:8:2]) # 1357 # 1文字目から8文字目まで2文字ステップで print(st[3:3]) print(st[5:2]) # どちらも""(空行) # 開始位置 < 終了位置でないといけない |
正のステップ値の場合は検索方向が左→右なので以下の関係でなければならない。
1 |
[開始位置:終了位置] -> 開始位置 < 終了位置 |
負のステップ値を使うと、最後尾から先頭へ向かって文字を取り出す。特にステップ値を-1とすると、1文字ずつ前へ向かって取り出すので、文字列の反転に便利。ただし開始位置と終了位置に注意が必要。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
st = "0123456789" print(st[::-2]) # 97531 # 全ての文字列に対して最後尾から1文字おきに取り出す print(st[::-1]) # 9876543210 # ステップ値を-1とすると逆向きに1文字ずつ取り出す print(st[7:3:-1]) print(st[-3:-7:-1]) # どちらも7654 # 部分文字列の指定は、後方の開始値:前方の終了値の順で # 位置指定には負の値も使える print(st[3:7:-1]) # ''(空行) # 逆順検索の場合は開始位置 > 終了位置でなければならない print(st[9:0:-1]) print(st[9:-1:-1]) # 987654321 # ''(空行) -> -1が最後尾の文字となって検索方向に合わないため # 先頭の文字が取り出せない print(st[-1:-11:-1]) # 9876543210 # これでok |
負のステップ値の場合には検索方向が右→左になるので、以下の関係でなければならない。
1 |
[開始位置:終了位置] -> 開始位置 > 終了位置 |
n文字目からm文字取得したい時。
1 2 3 4 5 |
s = "123456789" n = 1 m = 3 print(s[n-1:n-1+m]) # 123 |
スライスとfinde/rfindでは開始位置・終了位置の指定の考え方が違ってくる。
特定文字での分割
split()
メソッドは、指定した文字列で元の文字列を分解し、リストで返す。
1 2 3 4 |
s = "Bibbidi--Bobbidi--Boo" print(s.split("--")) # ['Bibbidi', 'Bobbidi', 'Boo'] |
partition()
メソッドは指定文字の最初の出現位置で文字列を分割し、タプルで結果を返す。
1 2 3 4 5 6 7 8 9 |
s = "Bibbidi--Bobbidi--Boo" print(s.partition("--")) # ('Bibbidi', '--', 'Bobbidi--Boo') # 戻り値はタプル print(s.partition("$$")) # ('Bibbidi--Bobbidi--Boo', '', '') # 区切り文字が見つからない場合の戻り値 |
内容の判定
stringオブジェクトの以下のメソッドは、それぞれの条件に合致した場合にTrueを返す。空文字列に対しては全てFalseを返す。
- isalpha()
- 全ての文字がアルファベットの場合にTrue。
1234>>> print("aA".isalpha())True>>> print("a0".isalpha())False - isdigit()
- 全ての文字が数字の場合にTrue。
1234>>> print("00".isdigit())True>>> print("0a".isdigit())False - isalnum()
- 全ての文字がアルファベットか数字の場合にTrue。
1234>>> print("0aA".isalnum())True>>> print("0a+".isalnum())False - islower()
- 文字列中のアルファベットが全て小文字の場合にTrue。アルファベット以外の数字や記号が含まれていても判定対象外で無視されるが、アルファベットがまったく含まれていないとFalse。
12345678>>> print("ab".islower())True>>> print("aA".islower())False>>> print("a0+".islower())True>>> print("00".islower())False - isupper()
- 文字列中のアルファベットが全て大文字の場合にTrue。アルファベット以外の数字や記号が含まれていても判定対象外。アルファベット以外の数字や記号が含まれていても判定対象外で無視されるが、アルファベットがまったく含まれていないとFalse。
12345678>>> print("AB".isupper())True>>> print("Ab".isupper())False>>> print("A0+".isupper())True>>> print("00".isupper())False - isspace()
- 全ての文字がスペースの場合にTrue。
1234>>> print(" ".isspace())True>>> print(" a".isspace())False - istitle()
- 文字列中の区切られた部分文字列がタイトルケースの場合にTrue。
123456>>> print("Chapter 1 - Firstcontact".istitle())True>>> print("Chapter 1 - firstcontact".istitle())False>>> print("Chapter 1 - FirstContact".istitle())False -
検索
find/rfind
find()
は指定した文字列を検索し、そのインデックスを返す。存在しない場合は-1が返される。検索範囲の指定はスライスと同じで[開始位置, 終了位置)。
index()
も同じ使い方ができるが、存在しない場合にValueError: substring not found
が返される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
st = "abcdeabcde" print(st.find("cd")) # 2 # findは先頭に近いインデックスが返される print(st.find("xy")) # -1 # 見つからなかった場合は-1 print(st.find("cd", 3)) # 7 # 開始位置以降で最も早く合致したもの print(st.find('c', 2, 8)) # 2 # 開始位置と終了位置の指定はスライスと同じ |
rfind()
は文字列の後方から検索する。開始位置と終了位置の意味はスライスと同じだが、開始位置だけ指定すると、そこから文字列の後方が検索範囲となってしまう点に注意。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
print(st.rfind("cd")) # 7 # rfindは後端に近いインデックスが返される print(st.rfind("xy")) # -1 # 見つからなかった場合は-1 [print(st.rfind('c', i), end=' ') for i in range(len(st))] # 7 7 7 7 7 7 7 7 -1 -1 # 開始位置は print() print(st.rfind('c', 1, 5)) # 2 |
find/rfindとスライスでの範囲指定が違ってくる点に注意。
内容の変更
連結
+
演算子で文字列を連結できる。
1 2 3 4 5 6 |
a = "My" b = " Fair" c = " Lady" print(a + b + c) # My Fair Lady |
join()
メソッドで、元の文字列オブジェクトを区切り文字にして、引数リストの各文字列要素を連結できる。
1 2 3 4 |
lyric = ["The", "Rain", "in", "Spain"] print("--".join(lyric)) # The--Rain--in--Spain |
数値と文字列を連結する場合、Pythonでは自動変換されない。str()
関数で明示的に文字列に変換する必要がある。
1 2 3 4 5 |
print("Python" + 3) # TypeError: Can't convert 'int' object to str implicitly print("Python" + str(3)) # Python3 |
join()
の方が推奨されているらしい。
1 2 3 4 5 |
split = '-' lst = ["Bibbidi", "Bobbidi", "Boo"] print(split.join(lst)) # Bibbidi-Bobbidi-Boo |
繰り返し
*演算子で同じ文字列を複数回繰り返した文字列を得られる。
1 2 3 4 |
shout = "Wow" print(shout * 4) # WowWowWowWow |
置き換え
replace(old, new[, count)
メソッドは、部分文字列old
をnew
で置き換える。count
が指定されると、先頭からその個数分だけ置き換える。
置き換え前後の部分文字列の長さが違ってもよい。置き換え後に空文字列を指定すると、文字列の削除に使える。
replace()
のほか、sub()
関数(reパッケージ)、str.translate()
関数も使える。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
s = "abcdabcdabcdabcd" print(s.replace("bc", "BC")) # aBCdaBCdaBCdaBCd print(s.replace("bc", "BC", 2)) # aBCdaBCdabcdabcd # 先頭から2個のみ置き換え print(s.replace("cd", "CDE")) # abCDEabCDEabCDEabCDE # 置き換え前後の部分文字列の長さが違ってもよい print(s.replace('d', '')) # abcabcabcabc # 文字(列)削除に使う |
なお、部分文字列をスライスで取得した書式を使って文字列を代入することはできず、エラーとなる。
1 2 3 4 5 6 7 |
s = "0123456789" s[3] = 'T' # Traceback (most recent call last): # File "test.py", line 3, in <module> # s[3] = 'T' # TypeError: 'str' object does not support item assignment |
書式・整形
センタリング・左寄せ・右寄せ
center()
、ljust()
、rjust()
の各メソッドで、元の文字列を指定した幅の中でセンタリング・左寄せ・右寄せできる。デフォルトでは空いた場所がスペース(‘ ‘)で埋められるが、その文字を指定することが可能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
s = "***" print('|' + s.center(10) + '|') print('|' + s.center(10, '-') + '|') print('|' + s.ljust(10, '-') + '|') print('|' + s.rjust(10, '-') + '|') # | *** | |---***----| # |***-------| # |-------***| print('|' + s.rjust(10, '--') + '|') # Traceback (most recent call last): # File "test.py", line 6, in <module> # print('|' + s.rjust(10, '--') + '|') # TypeError: The fill character must be exactly one character long |
余白などの切り落とし
strip()
、lstrip()
、rstrip()
各メソッドは、文字列の両端の指定文字を削除する。デフォルトでは空白が削除されるが、複数の文字を切り落とす対象として指定できる。
ただし、切り落とされるのは最も外側の文字列群だけであることに注意。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
s = " Python " print('|' + s.strip() + '|') print('|' + s.lstrip() + '|') print('|' + s.rstrip() + '|') # |Python| # |Python | # | Python| s = " $ Python $ " print('|' + s.strip() + '|') # |$ Python $| # 最も外側の該当文字だけが削除される s = "--$$ Python--$$ " print('|' + s.strip('- ') + '|') # |$$ Python--$$| # 複数文字を指定することも可能だが、これも最外側のみ |