順番に読み進めながら学べます

string と textwrap — 文字定数・テンプレートと整形

string.ascii_letters/digitsの文字定数とstring.Templateの $name置換、textwrap.dedentのインデント除去とfillの幅折り返しを、注文確認メールのテンプレで実行します。

string と textwrap の役割

stringtextwrap文字列処理を補うヘルパーです。string文字定数(英字・数字・記号の集まり)とTemplate$name形式のテンプレ置換)を提供し、textwrap複数行文字列の整形(インデント除去・幅折り返し)を担当します。f-string やreplaceだけでは届かない場面で使い分けます。

string と textwrap の使いどころ
string モジュール文字定数 + Template英字 / 数字の判定メール本文テンプレtextwrap モジュールdedent + fillインデント除去長文の幅折り返し用途用途
string文字の集合とテンプレ置換に強く、textwrap複数行文字列の見た目を整えるのに使う。どちらも標準ライブラリで、用途が重ならないので役割で覚えるのが楽。

string — 文字定数と Template によるテンプレート置換

string モジュールには 2 種類の機能があります。1 つ目は文字定数で、string.ascii_letters(英字 52 文字)/ string.digits(0〜9)/ string.punctuation(記号類)など、「英字とは」「数字とは」を自分で定義する手間を省くことができます

2 つ目はstring.Templateで、$nameのような$ 記号付きの変数を文字列に埋め込んでおき、後からsubstitute(name="値")で置換できます。f"{name}"の f-string と似ていますが、Template はパーサーが単純で安全という特徴があり、ユーザー入力をテンプレ自体にする場面(メール本文テンプレなど)に向きます。

string の主な機能
文字定数ascii_letters / digits「英字のみか」判定 / 生成Template$name 形式のテンプレsubstitute(name=値)で置換
文字定数は「英字 / 数字 / 記号」の判定や生成に使う。Template$name形式のプレースホルダー付き文字列substituteで値に置き換える、軽量で安全なテンプレ機構。
定数 / クラス中身用途
string.ascii_lowercaseabcdefghijklmnopqrstuvwxyz小文字英字 26 文字
string.ascii_uppercaseABCDEFGHIJKLMNOPQRSTUVWXYZ大文字英字 26 文字
string.ascii_letters上記の連結(52 文字)英字判定・乱数文字列生成
string.digits0123456789数字判定
string.punctuation! " # $ % & ' ... など記号判定
string.Template(s)$name 形式のテンプレートクラスメール本文・通知テンプレなど

注文確認メールのテンプレstring.Templateで作って、顧客名と注文番号を埋め込みます。

① string モジュールを読み込んでください

② 英字定数の総文字数英字の数: ◯の形で表示してください(大文字 + 小文字 = 52 のはずです)

③ 数字定数の中身数字: ◯◯の形で表示してください

"Hello, $name! Order #$order_id is ready."というテンプレ文字列から Template オブジェクトを作ってください

name="Alice"order_id=1234を埋め込んだ結果を表示してください

(正しく実行できれば解説が表示されます)

Python エディタ

コードを実行してください

textwrap — トリプルクォートのインデント除去と折り返し

textwrapは文字列の見た目を整える標準ライブラリです。よく使うのは 2 つで、textwrap.dedentトリプルクォートで書いたテキストの先頭インデントを取り除く関数、textwrap.fill長い文字列を指定幅で折り返す関数です。

コード中で"""..."""のように複数行の文字列を書くと、ソースのインデントがそのまま文字列に入ってしまいます。dedent共通する先頭の空白だけを除去するので、コードのインデントは保ちつつ文字列は綺麗な状態に揃えられます。

textwrap.dedent の働き
ソース上の文字列 こんにちは 今日は晴れtextwrap.dedent整った文字列こんにちは今日は晴れ
トリプルクォートに含まれる共通の先頭インデントを取り除き、コードの構造を保ったまま文字列だけ綺麗にする。各行に共通する空白の数を自動で見つけて、その分だけ削る仕組み。
関数意味戻り値
textwrap.dedent(text)共通の先頭インデントを除去する整形後の文字列
textwrap.fill(text, width=N)幅 N で折り返した 1 つの文字列に改行を含む 1 つの文字列
textwrap.wrap(text, width=N)幅 N で分割した行のリスト文字列のリスト
textwrap.shorten(text, w)幅 N に収まらなければ末尾を [...] で省略省略後の文字列
import textwrap

# dedent: トリプルクォートのインデントを除去
raw = """
    こんにちは。
    今日は良い天気ですね。
    """
print(textwrap.dedent(raw).strip())
# こんにちは。
# 今日は良い天気ですね。

# fill: 折り返し (英語の方が動きが分かりやすい)
long_text = "Python is a language that lets you work quickly and integrate systems."
print(textwrap.fill(long_text, width=30))
# Python is a language that
# lets you work quickly and
# integrate systems.

dedent と strip を組み合わせる

トリプルクォートの先頭は改行から始まることが多く、末尾も改行で閉じることが多いので、textwrap.dedent(raw).strip()の形でdedent + 前後の空白除去をワンライナーにするのが定石です。strip は組み込み文字列メソッドで、先頭と末尾の空白文字(改行を含む)を取り除きます。

インデント付きで書いたエラーメッセージのテンプレdedentで整え、英文をfillで折り返します。

① textwrap を読み込んでください

② 4 スペース字下げした 2 行の日本語文字列をトリプルクォートで定義してください(最初と最後に空行を挟みます)

③ そのインデントを除去し、前後の空白も取り除いて、最初に--- dedent 後 ---を表示してから整形結果を表示してください

④ 英文"Python is a language that lets you work quickly and integrate systems."幅 30 文字で折り返し、最初に--- fill 後 ---を表示してから結果を表示してください

Python エディタ

コードを実行してください
QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1string.Template("Hi $name").substitute(name="Bob")の結果はどれですか?

Q2トリプルクォートで書いた、ソースコードのインデント付きテキストから共通の先頭インデントを取り除くのに使うのはどれですか?

Q3textwrap.fill(text, width=20)の動きはどれですか?