Python: 文字列操作 まとめ

Pythonでの文字列操作について、文字列の生成から一部切り取り、検索、置換、分割など、 各種の文字列操作をまとめています。

文字列を生成

Pythonで文字列を生成する場合は、"(ダブルクォーテーション)または '(シングルクォーテーション)で囲みます。

# ダブルクォーテーションで囲む
s1 = "hello world"

# シングルクォーテーションで囲む
s2 = 'hello world'

個人で開発をする場合は、ダブルとシングルのどちらを使うは好みの問題なので自由です。 チームの一員として開発する場合は、コード規約に従って使ってください。

文字列中にクォーテーションを使いたい場合

文字列中にクォーテーションを使いたい場合は、 もう一方のクォーテーションを使うと便利です。

# 文字列中にダブルクォーテーションを使う
s = '<a href=""></a>'

print(s) # <a href=""></a>

# 文字列中にシングルクォーテーションを使う
s = "I'm fine"

print(s) # I'm fine

もう一方のクォーテーションを使わない場合は「\」記号でエスケープする必要があります。

s = "<a href=\"\"></a>"

print(s) # <a href=""></a>

s = 'I\'m fine'

print(s) # I'm fine

複数行の文字列

Pythonで複数行の文字列を生成する場合は、 """(ダブルクォーテーション3つ)または '''(シングルクォーテーション3つ)で囲みます。

# ダブルクォーテーション3つで囲む
s1 = """hello
world"""

# シングルクォーテーション3つで囲む
s2 = '''hello
world'''

この場合 s1、s2どちらの変数も次のように2行に分かれた値が入っています。

hello
world

複数行コメントとして利用するケースもある

複数行文字列の手法を応用して、複数行コメントとして使うケースもあります。 プログラム中に文字列だけの行を入れることができるため、 次のように記述できます。

"""
ここは
コメントです。
"""

ただしこの手法はあくまで便宜的な手法で、 正式なコメントアウトの手法ではありません。
コメントはできるだけ 「#(シャープ)」記号を使うことをおすすめします。

変数の値を埋め込む format()

文字列中に変数の値を埋め込む場合は、、 波括弧 {} と format() を使って次のように記述します。

埋め込みたい部分に {} を入れ、 format()の引数として埋め込む変数を指定します。

name = "田中"

words = "こんにちは{}さん"

print(words.format(name)) # こんにちは田中さん

print("さようなら{}さん".format(name)) # さようなら田中さん

変数が複数の場合

変数が複数の場合は変数をカンマで区切ります

s = "合計値"
num = 15

words = "2つの{}は {} です。"

print(words.format(s, num)) # 2つの合計値は 15 です。

文字列の長さ len()

文字列の長さを取得する場合は、 組み込み関数の len()関数を使います。

書式
len(s)

引数sで指定した文字列の長さを返します。 空文字の場合は0を返します。

s1 = "abcde"
s2 = "あいうえお"
s3 = ""

print(len(s1))  # 5
print(len(s2))  # 5
print(len(s3))  # 0

Nonoの場合はエラーになる

変数にNoneが設定されている場合に len(変数)を使うとエラーになります。

s = None

# エラーになる
print(len(s))  # TypeError: object of type 'NoneType' has no len()

文字列を連結 +

Pythonで文字列を連結する場合は「+」演算子を使います。

s = "hello" + " world!"

print(s) # hello world!

2つの文字列だけでなく、3つ以上の文字列連結もできます。

s = "a" + "b" + "c"

print(s) # abc

文字列型と数値型の連結はエラーになる

Pythonでは文字列型と数値型を連結しようとするとエラーになります。 (JavaScriptなど、自動で変換してくれる言語もありますが、 Pythonではエラーになります。

# エラーになる
s = 100 + "円です。"  

# エラーメッセージ
TypeError: unsupported operand type(s) for +: 'int' and 'str'

次のようにstr()関数を使って、 数値型をで文字列型に変換する必要があります。

s = str(100) + "円です。"

print(s)  # 100円です。

自分自身と他の文字列を連結 +=

「+=」演算子を使うと、自分自身と他の文字列を連結させることができます。

まずは「+」演算子を使った例です。

s = "hello"
s = s + " world!"
print(s) # hello world!

上のコードは「+=」演算子を使うと次のように記述できます。

s = "hello"
s += " world!"
print(s) # hello world!

つまり次の2つの行は同じ意味です。 「+=」演算子を使うとコードがシンプルになります。

s = s + "文字列"

s += "文字列"

数値を文字列に変換 str()

数値を文字列に変換する場合は、str() 関数を使います。

書式
str(数値)

数値には整数だけでなく、浮動小数点数も指定できます。

逆に文字列を整数にする場合は int()関数、 文字列を浮動小数点数に変換する場合は float()関数を使います。

まずは整数を文字列に変換してみます。

n = 100
print(type(n)) # <class 'int'>

# 文字列型に変換
s = str(n)

print(s)       # 100
print(type(s)) # <class 'str'>

次に浮動小数点数を文字列に変換してみます。

n = 0.3
print(type(n)) # <class 'float'>

# 文字列型に変換
s = str(n)

print(s)       # 0.3
print(type(s)) # <class 'str'>

エスケープシーケンス \

改行やタブなどの特殊な文字を表す場合、 頭に「\」をつけた2文字の組み合わせで1つの文字を表します。 例えば改行は「\n」、タブは「\t」など。 このように「\」との組み合わせて特殊な文字を表すものを エスケープシーケンスといいます。

Pythonでのエスケープシーケンスは次の通りです。

エスケープシーケンス意味
\n改行
\r復帰
\tタブ(水平タブ)
\v垂直タブ
\a警告音
\bバックスペース
\f改ページ
\''(シングルクォート)
\""(ダブルクォート)
\\\
\ooo8進数 ooo を持つ文字
\xhh16進数 hh を持つ文字

エスケープシーケンスのサンプル

次の文字列は間に改行コード「\n」が2つ入った、 3行の文字列です。

s = "a\nb\nc"

print(s)

# 実行結果
a
b
c

次の文字列はダブルクォート「"」を表すために、 エスケープシーケンス「\"」を使っています。

s = "これは\"特殊文字\"です"

print(s) # これは"特殊文字"です

1文字取得 [インデックス]

Pythonで文字列から指定位置の文字を1文字取り出す場合は、 インデックスを指定します。
文字列もリストと同じようにシーケンス (要素に順序が存在するしくみ)なので、 インデックスを指定することで取得できます。

書式
文字列[インデックス]

先頭のインデックスは「0」、2番目のインデックスは「1」です。
最後の文字を取り出す場合は「-1」、最後から2番目は「-2」と指定します。

s = "abcde"

# 先頭
print(s[0])  # a

print(s[1])  # b

# 最後
print(s[-1]) # e

print(s[-2]) # d

切り出し(範囲取得) []

文字列の一部を切り出したい(範囲取得したい)場合は、 次のように [] を使って指定します。

書式
文字列[開始インデックス:終了インデックス + 1]

先頭文字のインデックスは「0」です。

s = "abcde"

# 先頭から3文字目まで
print(s[0:3])  # abc

# 2番目から4文字目まで
print(s[1:4])  # bcd

インデックスを省略した場合

最初のインデックスを省略した場合は「0」指定と同じになり、 終了のインデックスを省略した場合は「len(文字列)」指定と同じになります。

s = "abcde"

# s[0:2] と同じ
print(s[:2])  # ab

# s[1:len(s)] と同じ
print(s[1:])  # bcde

インデックスに負の値を指定した場合

インデックスに負の値を指定した場合は、 最後からの文字数を指定することになります。
次のように「拡張子を取り除きたい」場合などに使えます。

s = "test.txt"

# 最後の4文字を取り除く
print(s[0:-4])  # test

ステップ数(間隔)を指定する

文字を取り出すステップ数(間隔)を指定することもできます。 次のように終了インデックスの次にステップ数を指定します。

文字列[開始インデックス:終了インデックス + 1:ステップ数]
s = "abcdefg"

# ステップ数を指定
print(s[::2])  # aceg

# 2番目の文字からステップ数2で取り出す
print(s[1::2]) # bdf

文字列を検索 find()

文字列を検索する場合は、find() や in演算子を使う方法があります。
文字列が見つかった位置(インデックス)を知りたい場合は find()メソッドを使います。

書式
文字列.find(部分文字列[, 開始[, 終了]])

戻り値は見つかった先頭を0とする文字列の位置(インデックス)です。 見つからなかった場合は「-1」を返します。

s = "abcdeabcde"

print(s.find("cd"))  # 2

print(s.find("xyx")) # -1

# 開始インデックスを指定
print(s.find("cd", 4)) # 7

# 終了インデックスを指定
print(s.find("cd", 4, 8)) # -1

文字列を最後から検索 rfind()

find()メソッドは文字列を先頭から検索しますが、 最後から検索したい場合は rfind()メソッドを使うと便利です。

s = "abcdeabcde"

print(s.rfind("cd")) # 7

検索 in

文字列を検索する場合は、 in演算子や find()メソッドを使う方法があります。
単に文字列が含まれているかどうかを True / False で知りたい時は、 in演算子を使います。

書式
検索する文字列 in 文字列

検索する文字列が含まれている場合は True、 含まれていない場合は Falseを戻します。

s = "abcdeabcde"

print("abc" in s) # True

print("xyz" in s) # False

in演算子の代わりに、「not in演算子」を使うこともできます。
その場合は、戻り値が逆になります。

s = "abcdeabcde"

print("abc" not in s) # False

print("xyz" not in s) # True

in演算子を使っての検索は、通常 if文の条件式で使われます。 if文の条件式で使う場合は次のように記述します。

s = "abcdeabcde"

if ("abc" in s) :
	# True時の処理
	print(True)
	
else :
	# False時の処理
	print(False)

置換 replace()

文字列を置換する場合は replace()メソッドを使います。

書式
文字列.replace(old, new[, count])

old を new に置換します。count は置換する回数です。
count が指定されていない場合は該当する文字列を全て置換します。

s = "abc abc abc"

s = s.replace("a", "x")

print(s) # xbc xbc xbc

次は置換回数を指定する場合です。

s = "abc abc abc"

s = s.replace("a", "x", 2)

print(s) # xbc xbc abc

分割 split()

文字列を指定した文字で分割する場合は、 split()メソッドを使います。

書式
文字列.split(区切り文字)
文字列.split(区切り文字, maxsplit=最大分割数)

戻り値はリストです。
区切り文字を指定しない場合は、 空白文字(改行、タブ、スペースなど)で分割されます。
maxsplit で最大分割数を指定できます。 指定した場合、最大分割数 + 1 の要素を持つリストが返って来ます。

# カンマで分割
li = s.split(",")

# タブで分割
li = s.split("\t")

# 改行で分割
li = s.split("\n")

(補足:改行で分割する場合は後述する splitlines()関数も使えます)

では実際にsplit()による分割処理をしてみます。

s = "a,b,c,d"

# カンマで分割
li = s.split(",")

print(li) # ['a', 'b', 'c', 'd']

maxsplit を指定する場合は次のように、 指定した分割数+1の要素を持つリストとなります。

s = "a-b-c-d"

li = s.split("-", maxsplit=2)

print(li) # ['a', 'b', 'c-d']

区切り文字を省略した場合

区切り文字を省略した場合は、 スペース・タブ・改行などの空白文字で分割されます。

# スペース、タブ、改行が混ざっている文字列
s = "a b \tc\nd "

li = s.split()

print(li) # ['a', 'b', 'c', 'd']

改行分割 splitlines()

文字列を改行で分割する場合は、splitlines()メソッドを使うと便利です。

Pythonに用意されている split() メソッドでも改行分割できますが、 splitlines() メソッドだと "\n" や "\r\n"のどちらでも自動で判断して 分割してくれます。 改行分割の場合は素直に splitlines()メソッドを使うことをおすすめします。

書式
文字列.splitlines()

# 改行コードを残す
文字列.splitlines(keepends=True)

戻り値は改行コードで分割された配列です。

s = "abc\ndef\nghi"

# 改行コードで分割
li = s.splitlines()

print(li) # ['abc', 'def', 'ghi']

改行コードを残す場合

「keepends=True」を指定すると改行コードを残すことができます。

s = "abc\ndef\nghi"

li = s.splitlines(keepends=True)

print(li) # ['abc\n', 'def\n', 'ghi']

前後の空白等を除去 strip()

文字列の先頭や末尾から空白等を取り除く場合は、 strip()メソッドを使います。

書式
# スペース・タブ・改行などの空白文字を取り除く
文字列.strip()

# 指定文字を取り除く
文字列.strip(除去する文字)

引数を省略した場合は空白文字(スペース・タブ・改行など)を取り除きます。

下の例では、前後の空白文字は取り除いていますが、 文字列中のスペース(abcとdeの間のスペース)はちゃんと残っています。

s = " abc de \n"

# 前後の空白文字を取り除く
s = s.strip()

print(s) # abc de

次は具体的に削除する文字を指定した場合です。

s = "%abcde%%"

# 指定文字を取り除く
s = s.strip("%")

print(s) # abcde

大文字・小文字変換

大文字に変換 upper()

文字列を大文字に変換する場合は upper()メソッドを使います。

書式
文字列.upper()

下の例では半角文字だけでなく、全角文字にも対応していることがわかります。

s = "abcde"

# 大文字に変換
s = s.upper()

print(s) # ABCDE

# -----------------------
# 全角文字
s1 = "abcde"
s1 = s1.upper()

print(s1) # ABCDE

小文字に変換 lower()

文字列を小文字に変換する場合は lower()メソッドを使います。

書式
文字列.lower()

下の例では半角文字だけでなく、全角文字にも対応していることがわかります。

s = "ABCDE"

# 小文字に変換
s = s.upper()

print(s) # ABCDE

# -----------------------
# 全角文字
s1 = "ABCDE"
s1 = s1.lower()

print(s1) # abcde

大文字を小文字、小文字を大文字に変換 swapcase()

大文字を小文字、小文字を大文字に変換したい場合は swapcase()メソッドを使います。

書式
文字列.swapcase()

下の例では半角文字だけでなく、全角文字にも対応していることがわかります。

s = "ABCde"

# 大文字・小文字変換
s = s.swapcase()

print(s) # abcDE

# -----------------------
# 全角文字
s1 = "ABCde"
s1 = s1.swapcase()

print(s1) # abcDE

文字列の出現回数 count()

文字列の中で、 指定した文字列の出現回数を調べる場合は、 count()メソッドを使います。

書式
文字列.count(部分文字列)

文字列.count(部分文字列[, 開始[, 終了]])

次のコードでは "b" の出現回数を数えています。

s = "abc abc abc"

num = s.count("b")

print(num)  # 3

開始位置を指定することもできます。

s = "abc abc abc"

num = s.count("b", 3)

print(num) # 2

大文字・小文字は区別される

count()メソッドでは大文字・小文字が区別されます。 次のコードでは出現回数は「2」となります。

s = "ABC abc abc"

num = s.count("b")

print(num) # 2

大文字・小文字の違いを無視してカウントする方法

大文字・小文字の違いを無視してカウントしたい場合は、 一旦 upper()メソッドで全部大文字にしてカウントするか、 lower()メソッドで全部小文字にしてからカウントする方法があります。

次のコードでは lower()メソッドを使って小文字にしてからカウントしています。

s = "ABC abc abc"

num = s.lower().count("b")

print(num) # 3