目的別のPython文字列操作テクニックまとめ
1. 文字列の生成と連結
文字列リテラルの作成方法や、複数の文字列を結合する方法です。
1.1. 基本的な生成
シングルクォート'
またはダブルクォート"
で囲みます。
1.2. 複数行文字列
トリプルクォート'''
または"""
で囲むと、改行を含む文字列を作成できます。
1.3. +
演算子による連結
文字列同士を +
で連結します。
注意点: 大量の文字列を連結する場合、+
演算子は中間文字列を生成するため非効率になることがあります。その場合は str.join()
を検討してください。
1.4. *
演算子による繰り返し
文字列を整数倍して繰り返します。
1.5. str()
による型変換
他のデータ型(数値など)を文字列に変換します。
1.6. f-string (フォーマット済み文字列リテラル)
Python 3.6以降で推奨される、最も簡潔で読みやすいフォーマット方法です。文字列リテラルの前に f
または F
を付け、{}
内に変数や式を記述します。
書式指定の詳細は Python公式ドキュメントの書式指定ミニ言語仕様 を参照してください。
1.7. str.format()
メソッド
f-stringが登場する前から使われているフォーマット方法です。{}
プレースホルダーを文字列内に配置し、format()
メソッドの引数で値を渡します。
1.8. %
演算子 (旧スタイル)
C言語の printf
スタイルに似た古い形式です。現在は f-string や str.format()
の利用が推奨されますが、既存のコードやログ出力などで見られます。
1.9. str.join()
メソッド
文字列のリスト(や他のイテラブル)を、指定した区切り文字で連結します。+
演算子よりも効率的な場合が多いです。
2. 文字列の分割と置換
文字列を特定のルールで分割したり、一部を別の文字列に置き換えたりします。
2.1. str.split(sep=None, maxsplit=-1)
指定した区切り文字 sep
で文字列を分割し、リストを返します。
sep
を省略またはNone
にすると、空白文字(スペース、タブ、改行など)で分割します。連続する空白は1つの区切り文字として扱われます。maxsplit
で分割回数の最大値を指定できます。指定した回数分割すると、残りは最後の要素に含まれます。-1
は制限なし(デフォルト)。
2.2. str.rsplit(sep=None, maxsplit=-1)
split()
と同様ですが、文字列の右側(末尾)から分割を開始します。maxsplit
の挙動が異なります。
2.3. str.splitlines(keepends=False)
文字列を改行コード(\n
, \r
, \r\n
など)で分割し、各行のリストを返します。
keepends=True
にすると、返されるリストの各要素の末尾に改行コードが含まれます。
2.4. str.partition(sep)
文字列内で最初に見つかった区切り文字 sep
で文字列を3つの部分(sep
の前の部分, sep
自身, sep
の後の部分)に分割し、タプルで返します。
sep
が見つからない場合は、(元の文字列, ”, ”) というタプルを返します。
2.5. str.rpartition(sep)
partition()
と同様ですが、文字列内で最後に現れた区切り文字 sep
で分割します。
2.6. str.replace(old, new, count=-1)
文字列中の部分文字列 old
を new
に置換します。
count
で置換する最大回数を指定できます。-1
は全て置換(デフォルト)。- 元の文字列は変更されず、新しい文字列が返されます。
2.7. str.translate(table)
/ str.maketrans(x, y, z)
複数の文字を一度に対応する文字に置換したり、特定の文字を削除したりします。maketrans()
で変換テーブルを作成し、translate()
に渡すのが一般的です。
maketrans(x, y)
: 文字列x
の各文字を、文字列y
の同じ位置にある文字にマッピングするテーブルを作成(x
とy
は同じ長さである必要があります)。maketrans(x, y, z)
: 上記に加え、文字列z
に含まれる全ての文字を削除(None
にマッピング)するテーブルを作成。maketrans(dict)
: {文字コード(int): 置換先(str/int/None)} の辞書からテーブルを作成。
3. 文字列の検索と判定
文字列内に特定のパターンが存在するかどうかを調べたり、文字列の特性(数字のみか、アルファベットのみかなど)を判定したりします。
3.1. in
演算子
部分文字列が文字列内に含まれているかを判定し、True
/ False
を返します。
3.2. 検索メソッド: find
, rfind
, index
, rindex
部分文字列が最初または最後に現れるインデックス(位置)を返します。
メソッド | 説明 | 見つからない場合の戻り値 | 例 |
---|---|---|---|
find(sub[, start[, end]]) | 文字列の左から部分文字列 sub を検索し、最初に見つかったインデックスを返す。 | -1 | "abcabc".find("bc") → 1 |
rfind(sub[, start[, end]]) | 文字列の右から部分文字列 sub を検索し、最初に見つかったインデックスを返す。 | -1 | "abcabc".rfind("bc") → 4 |
index(sub[, start[, end]]) | find() と同様だが、見つからない場合にエラー (ValueError ) を送出する。 | ValueError | "abcabc".index("bc") → 1 |
rindex(sub[, start[, end]]) | rfind() と同様だが、見つからない場合にエラー (ValueError ) を送出する。 | ValueError | "abcabc".rindex("bc") → 4 |
start
と end
引数で検索範囲を指定できます(スライスと同様の指定方法)。
3.3. str.count(sub[, start[, end]])
文字列中に部分文字列 sub
が出現する回数を返します。
3.4. str.startswith(prefix[, start[, end]])
文字列が指定した接頭辞 prefix
で始まるかどうかを判定します。prefix
は文字列のタプルでも指定でき、その場合はいずれか一つにマッチすれば True
となります。
3.5. str.endswith(suffix[, start[, end]])
文字列が指定した接尾辞 suffix
で終わるかどうかを判定します。suffix
もタプルで指定可能です。
3.6. 文字種別判定メソッド
文字列が特定の種類の文字(英数字、数字、空白など)だけで構成されているかを判定するメソッド群です。全て True
/ False
を返します。空文字列に対しては全て False
を返します。
メソッド | 説明 | 例 (True) | 例 (False) |
---|---|---|---|
isalnum() | 全ての文字が英数字(アルファベット or 数字)であり、かつ1文字以上あるか。 | "abc123" , "Python3" | "abc 123" , "Python-3" , "" |
isalpha() | 全ての文字がアルファベットであり、かつ1文字以上あるか。 | "abc" , "Python" , "あいう" | "abc1" , "Python 3" , "" |
isascii() | 全ての文字がASCII文字(U+0000-U+007F)であるか、または空文字列か。 | "Hello" , "123!@#" , "" | "こんにちは" , "你好" |
isdigit() | 全ての文字が数字(0-9)であり、かつ1文字以上あるか。 | "12345" | "123.45" , "-123" , "123a" , "①②③" , "" |
isdecimal() | 全ての文字が十進数文字であり、かつ1文字以上あるか。(UnicodeのDecimalカテゴリ) | "12345" , "٠١٢٣" (アラビア数字) | "123.45" , "①②③" (数字だが十進数ではない), "¹²³" (上付き文字), "" |
isnumeric() | 全ての文字が数値文字(数字、分数、ローマ数字、漢数字などを含む)であり、かつ1文字以上あるか。(UnicodeのNumericカテゴリ) | "123" , "¹²³" , "½" , "一二三" , "①②③" | "123.45" , "-123" , "abc" , "" |
islower() | 全てのアルファベット文字が小文字であり、かつアルファベットが1文字以上含まれるか。 | "hello world" , "python 3" | "Hello world" , "PYTHON" , "123" , "" |
isupper() | 全てのアルファベット文字が大文字であり、かつアルファベットが1文字以上含まれるか。 | "HELLO WORLD" , "PYTHON 3" | "Hello world" , "python" , "123" , "" |
isspace() | 全ての文字が空白文字(スペース、タブ \t , 改行 \n , 復帰 \r など)であり、かつ1文字以上あるか。 | " " , "\t\n " | " a " , "Hello" , "" |
istitle() | 文字列がタイトルケース(単語の先頭が大文字で、残りが小文字)であり、かつアルファベットが1文字以上含まれるか。数字や記号の後の文字は小文字でもよい。 | "Title Case String" , "Python Is Fun" , "1st Word" | "Title case string" , "python is fun" , "TITLE" , "" |
isidentifier() | 文字列がPythonの有効な識別子(変数名、関数名など)として使えるか。キーワードは False になる。 | "variable_name" , "myFunc" , "_private" , "変数1" | "1variable" , "my-func" , "class" (キーワード), "" |
isprintable() | 文字列中の全ての文字が印字可能文字(改行 \n やタブ \t などの制御文字以外)であるか、または空文字列か。空白は印字可能とみなされる。 | "Hello World 123!?" , " " , "" | "Hello\nWorld" , "abc\tdef" |
4. 文字列の整形と変換
文字列の見た目を整えたり、大文字/小文字を変換したり、特定の文字を除去したりします。
4.1. 空白除去メソッド: strip
, lstrip
, rstrip
文字列の両端、左端、右端から指定した文字(デフォルトは空白文字)を除去します。
メソッド | 説明 | 例 | 出力 |
---|---|---|---|
strip([chars]) | 両端から chars に含まれる文字を除去。chars 省略時は空白文字。 | " spacious ".strip() ".,xyABCxy.,".strip('.,xy') | "spacious" "ABC" |
lstrip([chars]) | 左端(先頭)から chars に含まれる文字を除去。chars 省略時は空白文字。 | " spacious ".lstrip() ".,xyABCxy.,".lstrip('.,xy') | "spacious " "ABCxy.," |
rstrip([chars]) | 右端(末尾)から chars に含まれる文字を除去。chars 省略時は空白文字。 | " spacious ".rstrip() ".,xyABCxy.,".rstrip('.,xy') | " spacious" ".,xyABC" |
4.2. 大文字/小文字変換メソッド
文字列内のアルファベットの大文字と小文字を変換します。
メソッド | 説明 | 例 | 出力 |
---|---|---|---|
lower() | 全てのアルファベットを小文字に変換。 | "PyThoN".lower() | "python" |
upper() | 全てのアルファベットを大文字に変換。 | "PyThoN".upper() | "PYTHON" |
capitalize() | 文字列の先頭の文字を大文字に、残りを小文字に変換。 | "pyThoN is FUN".capitalize() | "Python is fun" |
title() | 各単語の先頭文字を大文字に、残りを小文字に変換(タイトルケース)。単語の区切りは空白や記号など。 | "pyThoN is FUN".title() "they're".title() | "Python Is Fun" "They'Re" (注意: アポストロフィの後も大文字になる) |
swapcase() | 大文字と小文字を入れ替える。 | "PyThoN is Fun".swapcase() | "pYtHOn IS fUN" |
4.3. 寄せ/埋め込みメソッド: center
, ljust
, rjust
, zfill
指定した幅の中で文字列を配置したり、指定した文字で埋めたりします。
メソッド | 説明 | 例 | 出力 |
---|---|---|---|
center(width[, fillchar]) | 指定した width の中央に文字列を配置。余白は fillchar (デフォルトはスペース) で埋める。 | "abc".center(10) "abc".center(10, '-') | " abc " "---abc----" |
ljust(width[, fillchar]) | 指定した width の左側に文字列を配置。右側の余白は fillchar で埋める。 | "abc".ljust(10) "abc".ljust(10, '*') | "abc " "abc*******" |
rjust(width[, fillchar]) | 指定した width の右側に文字列を配置。左側の余白は fillchar で埋める。 | "abc".rjust(10) "abc".rjust(10, '0') | " abc" "0000000abc" |
zfill(width) | 指定した width になるように、文字列の左側をゼロ ‘0’ で埋める。符号 (+ , - ) は先頭に維持される。 | "42".zfill(5) "-42".zfill(5) | "00042" "-0042" |
4.4. str.expandtabs(tabsize=8)
文字列中のタブ文字 \t
を、指定された tabsize
(デフォルトは8) のスペースに置き換えます。タブ位置は累積的に計算されます。
4.5. str.removeprefix(prefix)
(Python 3.9+)
文字列が指定した接頭辞 prefix
で始まる場合、その接頭辞を削除した新しい文字列を返します。始まらない場合は元の文字列をそのまま返します。
4.6. str.removesuffix(suffix)
(Python 3.9+)
文字列が指定した接尾辞 suffix
で終わる場合、その接尾辞を削除した新しい文字列を返します。終わらない場合は元の文字列をそのまま返します。
5. エンコーディングとデコーディング
コンピュータが内部で扱うバイト列(bytes
)と、人間が読む文字列(str
)を相互に変換します。ファイル入出力やネットワーク通信で重要です。
5.1. str.encode(encoding='utf-8', errors='strict')
文字列 (str
) を指定した encoding
を使ってバイト列 (bytes
) に変換(エンコード)します。
- 一般的なエンコーディング:
'utf-8'
(推奨),'shift_jis'
(Windows日本語),'euc-jp'
(Unix日本語),'cp932'
(Shift_JISの亜種) errors
: エンコードできない文字があった場合の処理方法を指定します。'strict'
:UnicodeEncodeError
を送出 (デフォルト)。'ignore'
: エンコードできない文字を無視する。'replace'
: エンコードできない文字を?
に置き換える。'xmlcharrefreplace'
: XML文字参照 (例:Ӓ
) に置き換える。'backslashreplace'
: Pythonのバックスラッシュエスケープシーケンス (例:\u1234
) に置き換える。
5.2. bytes.decode(encoding='utf-8', errors='strict')
バイト列 (bytes
) を指定した encoding
を使って文字列 (str
) に変換(デコード)します。
encoding
とerrors
はencode()
と同様ですが、デコードできないバイトシーケンスに対する処理になります。errors='strict'
の場合、不正なバイトシーケンスがあるとUnicodeDecodeError
を送出します。
重要: エンコード時に使用したエンコーディングと、デコード時に使用するエンコーディングは、原則として一致させる必要があります。異なるエンコーディングを使用すると、文字化けやエラーの原因となります。
6. 正規表現 (re
モジュール)
複雑なパターンマッチングや文字列操作を行うための強力なツールです。import re
して利用します。
ここでは基本的な関数を紹介します。正規表現パターン自体の書き方は多岐にわたるため、別途学習が必要です。(参考: Python公式 re ドキュメント, 正規表現 HOWTO)
6.1. 検索: re.search(pattern, string, flags=0)
文字列 string
全体を検索し、正規表現 pattern
に最初にマッチした箇所を マッチオブジェクト として返します。マッチしない場合は None
を返します。
6.2. 先頭からマッチ: re.match(pattern, string, flags=0)
文字列 string
の先頭が正規表現 pattern
にマッチするかを試みます。先頭からマッチしない場合は None
を返します。
6.3. 完全一致: re.fullmatch(pattern, string, flags=0)
文字列 string
全体が正規表現 pattern
に完全にマッチするかを試みます。完全にマッチしない場合は None
を返します。
6.4. 分割: re.split(pattern, string, maxsplit=0, flags=0)
正規表現 pattern
にマッチする箇所を区切り文字として、文字列 string
を分割し、リストを返します。str.split()
の正規表現版です。
6.5. 全て検索: re.findall(pattern, string, flags=0)
文字列 string
中で正規表現 pattern
にマッチする全ての部分を文字列のリストとして返します。マッチが見つからない場合は空のリスト []
を返します。
6.6. 全て検索 (イテレータ): re.finditer(pattern, string, flags=0)
findall()
と似ていますが、マッチ結果をリストではなくマッチオブジェクトのイテレータとして返します。メモリ効率が良い場合に利用します。
6.7. 置換: re.sub(pattern, repl, string, count=0, flags=0)
文字列 string
中で正規表現 pattern
にマッチする部分を repl
(置換文字列または関数) で置換します。str.replace()
の正規表現版です。
count
: 最大置換回数。0は全て置換(デフォルト)。repl
には、マッチした部分を参照する特殊シーケンス(例:\1
,\g<name>
)を使用できます。repl
に関数を指定すると、各マッチオブジェクトを引数として関数が呼び出され、その戻り値が置換文字列として使用されます。
6.8. 置換 (置換回数付き): re.subn(pattern, repl, string, count=0, flags=0)
re.sub()
と同じ動作ですが、戻り値が (新しい文字列, 置換回数)
のタプルになります。
6.9. コンパイル: re.compile(pattern, flags=0)
正規表現パターンを事前にコンパイルしておくと、同じパターンを繰り返し使用する場合に効率が向上します。コンパイルされたパターンオブジェクトは、上記で紹介した関数(search
, match
など)をメソッドとして持ちます。
6.10. フラグ (flags
)
正規表現の挙動を調整するオプションです。複数のフラグは |
で組み合わせます。
re.IGNORECASE
/re.I
: 大文字小文字を無視してマッチング。re.MULTILINE
/re.M
:^
が各行の先頭、$
が各行の末尾にもマッチするようになる。re.DOTALL
/re.S
:.
が改行文字\n
にもマッチするようになる。re.VERBOSE
/re.X
: パターン内で空白やコメント (#
以降) を無視し、見やすく書けるようにする。re.ASCII
/re.A
:\w
,\W
,\b
,\B
,\d
,\D
,\s
,\S
がASCII文字のみにマッチするようになる。