このページの内容

Python 文字列:変換・クリーニング・検索・整形

文字列は、Python で最も頻繁に触れるデータ型です。ユーザー入力、ファイルの内容、Web ページ、CSV の行は、すべてテキストとして届きます。ただし過小評価されがちです。Python の文字列はイミュータブル(不変)であり、どのメソッドもその場で変更せず、すべての操作が新しい文字列を返します。このページでは、DelftStack の文字列ガイド全115本を、行いたい作業ごとに整理しています。軸となるのは四つのタスクライン、すなわち、テキストを他の型へ変換して戻すこと、属さない文字をクリーニングすること、文字列に何が含まれているかを検索してチェックすること、そして出力のためにテキストを整形したり置換したりすることです。

Python 文字列操作の概要:テキストの変換、クリーニング、検索、整形

文字列の学習パス

まずは五分で基礎を押さえましょう。文字列がどう作られ、インデックスやスライスでどう読むか、そしてイミュータブルだということが、なぜ常に返り値を保持しなければならないのかを理解します。次に検索とクリーニングを学びます。find()、in 演算子、strip()、replace() で日常のテキスト処理の大部分はまかなえます。続いて変換へ進みます。ここでは文字列がリスト、数値、辞書、バイト列と入れ替わります。最後はフォーマットと置換です。f文字列がデフォルトであり、それ以前のスタイルは今も通用する場面でのみ登場します。以下の各ステップは、このページの各グループに対応し、学ぶ順序に並んでいます。

5分で学ぶ基礎:作成・連結・繰り返し

文字列は、一重引用符または二重引用符で囲まれた文字の並びです。三重引用符を使えば複数行にまたがり、インデックスとスライスで任意の部分を読むことができます。仕事の大部分を担うのは二つの事実です。len() が文字列の長さを測ること、そして、より長い文字列を作ると常に新しい値が生まれることです。

  • Python で文字列を N 回繰り返す — 固定回数のコピーは * で掛け算し、その後、繰り返しとスライスでちょうど目標の長さに合わせ、空の文字列や負の長さを検証します。
  • Python で文字列をコピーする — イミュータブルであるため両方の変数が一つの値を共有する理由を説明したうえで、空文字列の連結、フルスライス、str()、%、format()、f文字列という六つの複製方法を紹介します。
  • Python で複数行の文字列を作成する — 本当の複数行テキストには三重引用符を、一つの論理行にはバックスラッシュと括弧による連結を、固定幅の出力には textwrap.fill() を使います。
  • Python で 1つの文字列を別の文字列に追加する — + と str.join() の比較です。ピースが多い場合は join() が勝ります。+ のたびに新しい中間文字列が作られるためです。

変換:文字列とリスト・数値の相互変換

変換こそ、文字列処理が真価を発揮する場面です。データはテキストとして届き、別の何かとして使われます。最も忙しい出入り口はリストで、次が数値です。コンテナは str() や join() で平らになり、バイト列との行き来は明示的なエンコーディングを通してのみ行われます。なお、近隣の話題が一つ別の場所にあります。datetime を文字列に変換する作業は Datetime ガイドの担当です。Python ピラー の Datetime セクションをご覧ください。

  • Python で文字列をリストに変換する — 代表的なガイドです。文字単位には list()、単語やフィールドには split()、リテラルテキストには ast.literal_eval() を使います。信頼できない入力に eval() を使ってはいけません。
  • Python でタプルを文字列に変換する — str() はタプルの構造を保ち、join() は区切りのきれいな結果を返し、要素ごとに str() を適用するジェネレータは型が混在する場合に対応します。
  • Python で辞書を文字列に変換する — 四つの方法を紹介します。手書きのループ、str()、交換用の json.dumps()、ネストを読みやすくする pprint.pformat() です。
  • Python での tostring() 相当の処理 — Python に toString() はありません。一つの値には str()、多数の値には join()、メッセージには f文字列、独自のクラスには __str__() を使います。
  • Python で文字列のリストを整数に変換する — 同じ変換を四通りの方法で示します。内包表記、map(int, ...)、明示的なループ、そして大規模なデータセット向けの NumPy です。
  • Python で Bytearray を文字列に変換する — bytes() を使うと b'...' という repr が残ってしまう理由と、bytearray.decode() が実際のテキストを返す理由を示します。
  • Python で文字列をバイナリに変換する — ord() によるコードポイントのバイナリと、08b の埋め込みを指定した bytearray() によるエンコード済みバイト列のバイナリを区別します。
  • Python で文字列をブール値に変換する — まず落とし穴から始めます。bool("False") は True です。そのうえで、未知の綴りには例外を出す、明示的なトークンパーサーを構築します。

クリーニングと削除:不要な文字を取り除く

クリーニングは、このクラスタの本拠地です。スクレイピングしたページ、エクスポート、ユーザー入力には、招かれざる文字が混じって届きます。汚れの形で選びましょう。既知の部分文字列が一つだけなら replace()、文字の集合をまとめて処理するならテーブルを使った translate()、汚れがリテラルではなくパターンなら正規表現です。

検索・チェック・カウント

検索は、このクラスタで最も満たされていない需要です。読者は探したい文字が分かっていて、その位置、個数、あるいは有無の答えを必要としています。役割分担をはっきりさせましょう。in は「あるかどうか」に、find() は「最初はどこか」に、index() は「どこか」に答えつつ一致がなければ大きな声で知らせ、count() は「いくつあるか」に答えます。

大文字小文字・比較・パディング

大文字小文字は、比較が静かに狂う場所です。Python は Unicode のコードポイントで比較するため、大文字小文字も特殊な文字もすべて影響します。比較の前に正規化しましょう。通常のテキストには lower() や upper() を、Unicode のペアを一致させる必要がある場合は casefold() を使い、体裁を整えるためには ljust()、rjust()、center()、zfill() で埋め込みます。

フォーマットと置換

新しいコードにおいてフォーマットとは f文字列のことです。値がテンプレートの中、読める場所に置かれ、フォーマット指定子で幅や精度を制御します。str.format() は、テンプレートが別に存在したり再利用されたりする場合に今も適しています。% によるフォーマットは、古いコードの中に生き残っており、これからも出会うことでしょう。置換もイミュータブルの原則に従います。文字列を編集するのではなく、修正済みの新しい文字列を作るのです。

文字列メソッドマップ

Python には47個の組み込み文字列メソッドが同梱されており、このマップを使えば適切なものを素早く見つけられます。動詞で読みましょう。is* 系はチェックを担い、大文字小文字のメソッドは変換を行い、split と join は分解と再構築を行い、検索系のメソッドは位置を特定します。あるメソッドをより深く扱うガイドがある場合は、三列目からリンクしています。セルが空の場合は、一行の説明で十分だという意味です。

メソッド 役割 詳しく見る
capitalize() 最初の文字を大文字にし、残りを小文字にする 詳しく見る
casefold() 大文字小文字を区別しない照合のために作られた、強力な小文字化 詳しく見る
center() 指定した幅のフィールドの中央に文字列を置く 詳しく見る
count() 部分文字列の、重ならない出現回数を数える 詳しく見る
encode() 選んだエンコーディングで文字列をバイト列にエンコードする 詳しく見る
endswith() 文字列が接尾辞で終わるかどうかをテストする
expandtabs() タブ文字をスペースに置き換える
find() 部分文字列の最小のインデックス。ない場合は -1 詳しく見る
format() {} プレースホルダーに値をフォーマットする 詳しく見る
format_map() format() と同様だが、値はマッピングから取る
index() 部分文字列の最小のインデックス。ない場合は ValueError を出す 詳しく見る
isalnum() すべての文字が文字または数字なら True 詳しく見る
isalpha() すべての文字がアルファベットなら True
isascii() すべての文字が ASCII なら True
isdecimal() すべての文字が10進数字なら True
isdigit() すべての文字が数字なら True 詳しく見る
isidentifier() 文字列が有効な Python 識別子なら True
islower() 大文字小文字の区別がある文字がすべて小文字なら True
isnumeric() すべての文字が数値なら True
isprintable() すべての文字が印字可能なら True
isspace() すべての文字が空白なら True
istitle() 文字列がタイトルケースなら True
isupper() 大文字小文字の区別がある文字がすべて大文字なら True
join() この文字列を区切り文字として、文字列のイテラブルを連結する 詳しく見る
ljust() 指定した幅のフィールドで左寄せにする 詳しく見る
lower() 小文字にしたコピーを返す 詳しく見る
lstrip() 先行する文字を取り除く(デフォルトは空白)
maketrans() translate() 用の変換テーブルを作る 詳しく見る
partition() 最初の区切り文字で分割し、3要素のタプルにする
removeprefix() 接頭辞が存在すれば取り除く
removesuffix() 接尾辞が存在すれば取り除く
replace() 部分文字列の出現を別の文字列に置き換える 詳しく見る
rfind() 部分文字列の最大のインデックス。ない場合は -1 詳しく見る
rindex() 部分文字列の最大のインデックス。ない場合は ValueError を出す
rjust() 指定した幅のフィールドで右寄せにする 詳しく見る
rpartition() 最後の区切り文字で分割し、3要素のタプルにする
rsplit() 区切り文字で、右側から数えて分割する
rstrip() 末尾の文字を取り除く(デフォルトは空白)
split() 区切り文字で分割してリストにする 詳しく見る
splitlines() 行の境界で分割してリストにする
startswith() 文字列が接頭辞で始まるかどうかをテストする 詳しく見る
strip() 先行および末尾の文字を取り除く 詳しく見る
swapcase() すべての文字の大文字小文字を入れ替えたコピーを返す
title() 各単語の先頭を大文字にした、タイトルケースのコピーを返す
translate() 変換テーブルを通して文字をマッピングする 詳しく見る
upper() 大文字にしたコピーを返す 詳しく見る
zfill() 指定した幅になるよう先行ゼロで埋める 詳しく見る

よくある質問

Python で文字列をリストに変換するには?

一つの要素が何であるべきかを決め、合うツールを選びましょう。list(text) は一文字ごとに一要素を与え、text.split() は単語を与え、text.split(",") は区切り文字で区切られたフィールドを与え、空のフィールドも保持します。すでに Python のリストのように見えるテキストは、ast.literal_eval() でパースし、結果が本当にリストかどうかを確認します。制御できない入力に eval() を使ってはいけません。手順の全文は Python で文字列をリストに変換する にあります。

文字列に部分文字列や単語が含まれているかどうかを確認するには?

素朴な部分文字列テストには in 演算子を使います。"word" in text は真理値を返し、大文字小文字を区別します。位置も必要な場合は、find() が最初のインデックスか -1 を返し、index() は代わりに ValueError を出します。in はより大きな単語の内部でも一致することに注意してください。"is" in "This" は真です。そのため、単語全体を対象にする場合は、トークン化するか、\b 境界を使う正規表現を使います。文字列に Python で単語が含まれているかどうかを確認する で示されている通りです。

文字列から句読点や特殊文字を取り除くには?

まず、何を取り除くべきかを定義します。句読点だけか、文字と数字以外はすべてか。句読点については、string.punctuation に対するフィルタ、正規表現 [^\w\s] による置換、maketrans() で作った str.translate() テーブルによる一括削除(最も高速な選択肢)が使えます。より幅広いクリーニングには、isalnum() フィルタが Unicode の文字と数字を保持します。Python で文字列から句読点を取り除く方法 が各バリエーションを解説しています。

Python が「文字列のフォーマット中にすべての引数が変換されたわけではない」と言うのはなぜですか?

この TypeError は % によるフォーマットから生じます。テンプレート内のプレースホルダーの数が、渡した値のタプルより少ないため、引数が余ったままテンプレートの終わりに達するのです。たとえば "Value: " % (1, 2)のような場合です。各値にちょうど一つのプレースホルダーを与え、単一の値は一要素のタプルで包み、リテラルのパーセント記号は%%` としてエスケープしてください。TypeError を解決する: Python での文字列の書式設定中にすべての引数が変換されるわけではありません が、このメッセージをケースごとに解剖しています。

Python に toString() はありますか?

ありません。Python に toString() メソッドは存在しません。それを探すのは Java から持ち越した習慣です。等価なのは組み込みの str(value) で、数値、コレクション、ほとんどのオブジェクトに対して読みやすい文字列を返します。多数の文字列を結合するには join() を、メッセージを組み立てるには f文字列を、表示の制御には独自のクラスに __str__() を定義してください。なお、str() が生成するのは表示用のテキストであり、JSON や CSV ではありません。Python での tostring() 相当の処理 をご覧ください。

特定のインデックスにある一文字を置き換えるには?

文字列への代入はできません。文字列はイミュータブルなため、text[2] = "m" は TypeError を出します。代わりに置換後の文字列を構築します。その位置の前後でスライスする text[:2] + "m" + text[3:] か、リストに変換してインデックスに代入し、"".join(...) で再結合します。どちらも新しい文字列を返し、元の文字列には触れません。インデックスがユーザー入力に由来する場合は、len(text) に対して検証してください。Python のインデックスで文字列の文字を置き換える が両方の方法を示しています。

Python 文字列ガイド全一覧

基礎

変換

クリーニングと削除

検索・チェック・カウント

大文字小文字・比較・パディング

フォーマットと置換

その他の文字列記事

以上が文字列クラスタの端から端までです。より広い全体像、すなわちリスト、辞書、ファイル、日付、エラーについては、Python ピラー に戻ってください。そこでは、このページが展開する Strings グループと並んで Dictionary グループと List グループが置かれています。