文字列処理
1.文字列から文字を取り出してみよう:インデックス
文字列は、配列(リスト)と同様に インデックス (添字)で指定して文字を取り出すことができます。
s = "abcdef"
print(s[0]) # 0文字目 => aprint(s[3]) # 3文字目 => dprint(s[-1]) # 末尾の文字 => f
※Pythonには、インデックスを利用して文字列から一部分の文字列を取り出す スライス という機能もあります。スライスについては後述します。
2.文字列を探してみよう:in演算子
in
演算子を使えば、対象とする文字列の中に指定した文字列があるかどうかを知ることができます。具体的には次のように使用します。
文字列B in 文字列A
調べたい 文字列B が含まれていれば True
が、そうでなければ False
が返ります。 in
の前に not
をつければ「含まれていなければ」ということになります。
s = "abcdef"
print('cd' in s) # Trueprint('cd' not in s) # False
※ index
メソッドとの違いは、 in
演算子は True
か False
を返すのに対して、 index
メソッドは見つかった位置を返します。
3.文字列をくっつけてみよう:+演算子
+
演算子を使えば、文字列と文字列を連結することができます。
s1 = "abcdef"s2 = "ghijkl"
print(s1 + s2) # abcdefghijkl
(注意)文字列と数値を連結しようとするとエラーになります。その場合は数値を文字列に変換(str関数)して連結します。
4.文字列を操作しよう:split、replace、index、…
文字列クラスには、様々なメソッド(関数)があり、これを使えば文字列を操作することができます。具体的には次のように使用します。
文字列.メソッド名(式, …)
削除
文字列の先頭や末尾の文字を簡単に削除することができます。引数を指定しなければ、 空白文字 (スペースや改行など)を削除します。これはファイルからの1行読み込んだ時の処理などに使います。
両端(先頭、末尾)の文字を削除 | strip メソッド |
末端の文字を削除 | rsprit メソッド |
先頭部分の文字を削除 | lsprit メソッド |
line = " ab c \n" #ファイルから1行読み込んだ時の状態。改行(\n)あり。
print(">>>"+line+"<<<")#>>> ab c#<<<
print(">>>"+line.strip()+"<<<")#>>>ab c<<<
※文字列の途中の文字の削除は 置換 の項で述べます。
※文字の位置(インデックス)を使って削除する場合は スライス でできます。
置換
replace
メソッドを使えば、指定した文字列を別の文字列に置換できます。具体的には次のように使用します。
文字列.replace(部分文字列A, 文字列B)
指定した 部分文字列A を、別に指定した 文字列B で置き換えた文字列を新たに作成して返します。元の文字列はそのままです。
置き換える文字列Bを空文字(””)にすれば、 削除 になります。
s="Good morning"
print(s.replace("morning","evening")) # Good eveningprint(s.replace("morning","")) # Goodprint(s.replace("o","")) # Gd mrning
検索
index
メソッドまたは find
メソッドを使えば、対象とする文字列の中に指定した部分文字列がある位置を知ることができます。具体的には、次のように使用します。
文字列A.index(部分文字列B)
文字列A.find(部分文字列B)
ただし、指定した部分文字列Bが文字列Aに複数回含まれる場合、最初のインデックスが返されます。
指定した部分文字列Bが文字列Aに含まれない場合、 index
メソッドの場合はエラーとなります。 find
メソッドは-1を返します。
s="Good morning"
print(s.index("o")) # 1#print(s.index("a")) # エラー
print(s.find("o")) # 1print(s.find("a")) # -1
※ in
演算子との違いは、 in
演算子は True
か False
を返すのに対して、 index
メソッドや find
メソッドは見つかった位置を返します。
大文字・小文字
upper
メソッド、 lower
メソッドを使えば、文字列を大文字または小文字に変換できます。
s = "I love Japan"
print(s.upper()) # I LOVE JAPANprint(s.lower()) # i love japan
数え上げ
count
メソッドを使えば、文字数を数え上げることができます。
s = "AAGCCCATTGTACA"
print(s.count("A")) # 5
5.文字列とリストを相互に変換しよう:list、join
文字列とリストを相互に変換する方法を示します。
文字列からリストを作る
list
関数を使えば、文字列を1文字ずつ分解してリストにすることができます。
s1 = "abcdef"print(list(s1)) # ['a', 'b', 'c', 'd', 'e', 'f']
split
メソッドを使えば、指定した区切り文字で文字列を分割することができます。CSVファイルからの読み込みなどの時に使われます。引数を省略した場合は、スペースで分割されます?
s2 = "tento,男,10"s3 = "I have a dream"
print(s2.split(",")) # ['tento', '男', '10']print(s3.split()) # ['I', 'have', 'a', 'dream']
リストから文字列を作る
join
メソッドを使えば、リストから、区切り文字を入れた文字列を作ることができます。具体的には、次のように使用します。
'区切り文字'.join(リスト)
区切り文字の所が空文字(’’)なら、リストの要素をそのままつなげた文字列を作ります。
lst1 = ['a', 'b', 'c', 'd', 'e', 'f']lst2 = ['tento', '男', '10']
print(''.join(lst1)) # abcdefprint(','.join(lst2)) # tento,男,10
6.文字列から一部分を取り出してみよう:スライス
Pythonにはリストや文字列の一部を切り取って、そのコピーを返してくれるスライスという便利な仕組みがある。
スライスの使い方
s[start : stop : step]
- start: 始めの位置(省略すると最初から)
- stop: 終わりの位置(省略すると最後まで)
- step: 文字の間隔(省略すると1文字ずつ。負の数を入れると逆順)
s = "0123456789"
#前から順番に取り出すprint(s[1:4]) # 1文字目から3文字目まで => 123print(s[:3]) # 最初からから2文字目まで => 012 s[0:3]でも同じprint(s[::2]) # 最初から最後まで1文字飛ばし => 02468print(s[1:7:2]) # 1文字目から7文字目まで1文字飛ばし => 135print(s[-4:-1]) # 末尾4文字目から末尾1文字目まで => 678
#逆順に取り出すprint(s[::-1]) # 最初から最後まで逆順 => 9876543210print(s[5:1:-1]) # 5文字目から1文字目まで逆順 => 5432
※位置は、最初は0から数えていきます。
※stop(終わりの位置)の文字は含まれないことに注意してください。
※stepに -1 を指定したときは、start/stopも逆順になるので注意してください。
※文字列を逆順にする s[::-1]
はよく使われます。覚えておくと良いでしょう。
やってみよう
「 Python 言語処理100本ノックを解こう」 は、文字列処理の問題および解説があります。挑戦してみてください。