Python文字列マスター:作成、フォーマット、操作
Python文字列
このチュートリアルでは、Pythonでの文字列の作成、フォーマット、変更、削除、さまざまな文字列操作と関数を学びます。
動画:Python文字列
Pythonにおける文字列とは?
文字列は文字のシーケンスです。
文字は単なる記号です。例えば英語には26文字あります。
コンピュータは文字を直接扱わず、数値(バイナリ)を扱います。画面上では文字に見えても、内部では0と1の組み合わせとして格納・操作されます。
文字から数値への変換をエンコーディング、逆をデコーディングと呼びます。ASCIIやUnicodeが一般的なエンコーディングです。
Pythonでは文字列はUnicode文字のシーケンスです。Unicodeは全言語の文字を含め、エンコーディングの統一を図るために導入されました。詳細はPython Unicodeを参照。
Pythonでの文字列の作成方法
文字列はシングルクォート、ダブルクォートで囲んで作成します。トリプルクォートも使用可能ですが、主に複数行文字列やドックストリングに用います。
# Pythonでの文字列定義
# 以下はすべて等価
my_string = 'Hello'
print(my_string)
my_string = "Hello"
print(my_string)
my_string = '''Hello'''
print(my_string)
# トリプルクォートで複数行
my_string = """Hello, welcome to the world of Python"""
print(my_string)
実行結果:
Hello Hello Hello Hello, welcome to the world of Python
文字列の文字へのアクセス方法
インデックスで個別文字、スライシングで文字範囲にアクセスできます。インデックスは0から開始。範囲外アクセスはIndexError、整数以外はTypeErrorを発生させます。
Pythonはシーケンスに負のインデックスを許可します。-1は最後、-2は最後から2番目、以下同様。スライシング演算子:で範囲アクセス可能です。
# Pythonでの文字列アクセス
str = 'programiz'
print('str = ', str)
# 最初の文字
print('str[0] = ', str[0])
# 最後の文字
print('str[-1] = ', str[-1])
# 2〜5文字目
print('str[1:5] = ', str[1:5])
# 6文字目〜最後から2番目
print('str[5:-2] = ', str[5:-2])
実行結果:
str = programiz str[0] = p str[-1] = z str[1:5] = rogr str[5:-2] = am
範囲外や非整数インデックスではエラーになります。
# インデックスは範囲内でなければならない
>>> my_string[15]
...
IndexError: string index out of range
# インデックスは整数でなければならない
>>> my_string[1.5]
...
TypeError: string indices must be integers
スライシングは、インデックスが要素の間にあると考えると視覚化しやすいです。

文字列の変更または削除
文字列はイミュータブルです。一度代入された要素は変更できません。同じ名前で異なる文字列を再代入するだけです。
>>> my_string = 'programiz'
>>> my_string[5] = 'a'
...
TypeError: 'str' object does not support item assignment
>>> my_string = 'Python'
>>> my_string
'Python'
文字列から文字を削除することはできません。ただしdelキーワードで文字列全体を削除可能です。
>>> del my_string[1]
...
TypeError: 'str' object doesn't support item deletion
>>> del my_string
>>> my_string
...
NameError: name 'my_string' is not defined
Python文字列操作
文字列で実行できる操作は多数あり、最もよく使われるデータ型の一つです。
Pythonで利用可能なデータ型についてはPythonデータ型を参照。
2つ以上の文字列の連結
複数の文字列を1つに結合することを連結と呼びます。
Pythonでは+演算子で実現。単に2つの文字列リテラルを並べるだけでも連結されます。
*演算子で指定回数繰り返せます。
# Python文字列操作
str1 = 'Hello'
str2 = 'World!'
# +を使用
print('str1 + str2 = ', str1 + str2)
# *を使用
print('str1 * 3 =', str1 * 3)
実行結果:
str1 + str2 = HelloWorld! str1 * 3 = HelloHelloHello
2つの文字列リテラルを並べるだけでも+演算子と同様に連結されます。
異なる行の文字列を連結するには括弧を使用します。
>>> # 2つの文字列リテラルを並べる
>>> 'Hello ''World!'
'Hello World!'
>>> # 括弧を使用
>>> s = ('Hello '
... 'World')
>>> s
'Hello World'
文字列のイテレーション
forループで文字列をイテレーションできます。文字列内の'l'の数を数える例:
# 文字列のイテレーション
count = 0
for letter in 'Hello World':
if letter == 'l':
count += 1
print(count, 'letters found')
実行結果:
3 letters found
文字列のメンバーシップテスト
inキーワードで部分文字列の存在をテストできます。
>>> 'a' in 'program'
True
>>> 'at' not in 'battle'
False
文字列で働く組み込み関数
シーケンスで働くさまざまな組み込み関数が文字列でも動作します。
よく使われるのはenumerate()とlen()。enumerate()はenumerateオブジェクトを返し、文字列の全アイテムのインデックスと値のペアを含みます。イテレーションに便利です。len()は文字列の長さ(文字数)を返します。
str = 'cold'
# enumerate()
list_enumerate = list(enumerate(str))
print('list(enumerate(str) = ', list_enumerate)
# 文字数
print('len(str) = ', len(str))
実行結果:
list(enumerate(str) = [(0, 'c'), (1, 'o'), (2, 'l'), (3, 'd')] len(str) = 4
Python文字列フォーマット
エスケープシーケンス
He said, "What's there?"のようなテキストを出力したい場合、シングルクォートもダブルクォートも使えません。テキスト自体が両方のクォートを含むためSyntaxErrorになります。
>>> print("He said, "What's there?"")
...
SyntaxError: invalid syntax
>>> print('He said, "What's there?"')
...
SyntaxError: invalid syntax
回避策の一つはトリプルクォートの使用。もう一つはエスケープシーケンスです。
エスケープシーケンスはバックスラッシュで始まり、異なる解釈されます。シングルクォートで文字列を表す場合、内部のシングルクォートをすべてエスケープする必要があります。ダブルクォートも同様です。
# トリプルクォート使用
print('''He said, "What's there?"''')
# シングルクォートをエスケープ
print('He said, "What\'s there?"')
# ダブルクォートをエスケープ
print("He said, \"What's there?\"")
実行結果:
He said, "What's there?" He said, "What's there?" He said, "What's there?"
Pythonがサポートするすべてのエスケープシーケンス一覧:
| エスケープシーケンス | 説明 |
|---|---|
| \newline | バックスラッシュと改行を無視 |
| \\ | バックスラッシュ |
| \' | シングルクォート |
| \" | ダブルクォート |
| \a | ASCIIベル |
| \b | ASCIIバックスペース |
| \f | ASCIIフォームフィード |
| \n | ASCIIラインフィード(改行) |
| \r | ASCIIキャリッジリターン |
| \t | ASCII水平タブ |
| \v | ASCII垂直タブ |
| \ooo | 8進数値oooの文字 |
| \xHH | 16進数値HHの文字 |
例:
>>> print("C:\\Python32\\Lib")
C:\Python32\Lib
>>> print("This is printed\nin two lines")
This is printed
in two lines
>>> print("This is \x48\x45\x58 representation")
This is HEX representation
エスケープシーケンスを無視するRaw文字列
文字列内のエスケープシーケンスを無視したい場合、文字列の前にrまたはRを付けます。これによりRaw文字列となり、内部のエスケープシーケンスが無視されます。
>>> print("This is \x61 \ngood example")
This is a
good example
>>> print(r"This is \x61 \ngood example")
This is \x61 \ngood example
format()メソッドによる文字列フォーマット
文字列オブジェクトで利用可能なformat()メソッドは、文字列フォーマットにおいて非常に汎用的かつ強力です。フォーマット文字列にはプレースホルダとして波括弧{}を含め、これが置換されます。
位置引数またはキーワード引数で順序を指定できます。
# Python string format()メソッド
# デフォルト(暗黙)の順序
default_order = "{}, {} and {}".format('John','Bill','Sean')
print('\n--- Default Order ---')
print(default_order)
# 位置引数で順序指定
positional_order = "{1}, {0} and {2}".format('John','Bill','Sean')
print('\n--- Positional Order ---')
print(positional_order)
# キーワード引数で順序指定
keyword_order = "{s}, {b} and {j}".format(j='John',b='Bill',s='Sean')
print('\n--- Keyword Order ---')
print(keyword_order)
実行結果:
--- Default Order --- John, Bill and Sean --- Positional Order --- Bill, John and Sean --- Keyword Order --- Sean, Bill and John
format()メソッドにはオプションのフォーマット仕様を指定できます。フィールド名からコロンで区切って指定します。例えば、与えられた幅で左寄せ<、右寄せ>、中央揃え^が可能です。
整数をバイナリ、16進数などでフォーマットしたり、浮動小数点を丸めたり指数形式で表示したりもできます。format()で利用可能なすべてのフォーマットについてはこちらを参照。
>>> # 整数のフォーマット
>>> "Binary representation of {0} is {0:b}".format(12)
'Binary representation of 12 is 1100'
>>> # 浮動小数点のフォーマット
>>> "Exponent representation: {0:e}".format(1566.345)
'Exponent representation: 1.566345e+03'
>>> # 丸め
>>> "One third is: {0:.3f}".format(1/3)
'One third is: 0.333'
>>> # 文字列アライメント
>>> "|{:<10}|{:^10}|{:>10}|".format('butter','bread','ham')
'|butter | bread | ham|'
旧スタイルフォーマット
C言語のsprintf()スタイルのような古いフォーマットも使用可能です。%演算子を使用します。
>>> x = 12.3456789
>>> print('The value of x is %3.2f' % x)
The value of x is 12.35
>>> print('The value of x is %3.4f' % x)
The value of x is 12.3457
一般的なPython文字列メソッド
文字列オブジェクトには多数のメソッドがあります。前述のformat()もその一つ。よく使われるのはlower()、upper()、join()、split()、find()、replace()など。Pythonで文字列を扱うすべての組み込みメソッドの完全なリストは以下の通りです。
>>> "PrOgRaMiZ".lower()
'programiz'
>>> "PrOgRaMiZ".upper()
'PROGRAMIZ'
>>> "This will split all words into a list".split()
['This', 'will', 'split', 'all', 'words', 'into', 'a', 'list']
>>> ' '.join(['This', 'will', 'join', 'all', 'words', 'into', 'a', 'string'])
'This will join all words into a string'
>>> 'Happy New Year'.find('ew')
7
>>> 'Happy New Year'.replace('Happy','Brilliant')
'Brilliant New Year'
Python
- C# 文字列をマスターする:基礎、操作、高度なテクニック
- Python辞書完全ガイド:作成、操作、高度なテクニック
- Python文字列操作マスター:replace、join、split、reverse、大文字小文字変換
- Python strip()メソッド完全ガイド:実践例付き
- Python str.count()マスター:文字と部分文字列のカウント実例集
- Python format()文字列を明確な例でマスター
- Python len()関数:オブジェクトの長さを測る実践ガイド
- Python String.find()メソッド完全ガイド:構文、例、代替手法
- Python enumerate()をマスター:リスト、タプル、文字列、辞書でインデックス付きループ
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Java Enumの文字列表現マスター:デフォルト、オーバーライド、高度なパターン