テキストの処理の要点
内容の確認日: 2026-10-04
この分野は『Python実践レシピ』の第 6 章 (テキストの処理) に対応し、40 問中 4 問が出題されます。文字列のメソッド、f-string の書式、正規表現が中心で、「この呼び出しの結果はどれか」を問う問題がほとんどです。
改訂新版では、Python 3.14 で追加された t-string (テンプレート文字列リテラル) の節が加わりました。f-string との違いを押さえておきましょう。
文字列のメソッド
文字列はイミュータブル (変更不可) で、メソッドはすべて新しい文字列を返します。試験でよく問われるのは、分割・除去・判定のメソッドの細かい動きです。
・split(区切り): 区切りを指定すると、連続した区切りの間は空文字列になる。引数なしの split() は連続する空白をまとめ、前後の空白も無視する
・rsplit(区切り, 回数): 右から最大の回数だけ分割する
・partition(区切り): 最初の区切りで (前, 区切り, 後) の 3 つのタプルに分ける
・strip(文字): 両端から指定した文字 (の集合) を取り除く。lstrip・rstrip は片側だけ
・removeprefix・removesuffix: 先頭・末尾が一致するときだけ取り除く (Python 3.9 以降)
・find は見つからないと -1、index は ValueError
・startswith・endswith はタプルで複数の候補を指定できる
line = " name = Sato, Taro "key, sep, value = line.strip().partition("=")print(repr(key.strip()), repr(value.strip()))print("a,,b".split(","), " a b ".split())print("www.example.com".strip("w.moc"), "v1.2.3".removeprefix("v"))print("2026-12-01".rsplit("-", 1), "data.csv".endswith((".csv", ".tsv")))python3 main.py 'name' 'Sato, Taro' ['a', '', 'b'] ['a', 'b'] example 1.2.3 ['2026-12', '01'] True
strip("w.moc") は文字列 "w.moc" を取り除くのではなく、w・.・m・o・c のどれかの文字が続く限り両端から取り除きます。決まった文字列を取り除きたいときは removeprefix・removesuffix を使います。
ほかに、str.maketrans と translate で文字を一括で置き換え・削除でき、casefold() は lower() より強い小文字化 (ドイツ語の ß を ss にするなど) で、大文字と小文字を区別しない比較に向いています。string モジュールには ascii_lowercase・digits などの定数と、$名前 を置き換える Template があります。Template の substitute は値が足りないと KeyError、safe_substitute はそのまま残します。
f-string と書式指定
f-string (f"...") は、{式} の部分を評価して埋め込みます。{式:書式} で書式を指定でき、str.format() と同じ書式指定が使えます。
・{x:>8}・{x:<8}・{x:^8}: 幅 8 で右寄せ・左寄せ・中央寄せ。{x:*^8} のように埋める文字も指定できる
・{n:05d}: 0 で埋めて 5 桁の整数
・{n:,}: 3 桁ごとのカンマ区切り
・{x:.2f}: 小数点以下 2 桁
・{r:.1%}: 100 倍してパーセント表示
・{n:b}・{n:x}: 2 進数・16 進数
{式!r} は repr() で変換し、文字列は引用符付きになります。{式=} と書くと、式のテキストと値を 式=値 の形で出力でき、デバッグに便利です (= の後に書式も書けます)。
item, price, rate = "coffee", 1234567, 0.125print(f"{item:<8}|{price:>12,}|{rate:.1%}")print(f"{7:03d} {255:x} {5:08b}")print(f"{item!r} {price=} {rate=:.2f}")python3 main.py coffee | 1,234,567|12.5% 007 ff 00000101 'coffee' price=1234567 rate=0.12
rate=:.2f の 0.125 は、浮動小数点数の丸め (偶数への丸め) で 0.12 になります。
t-string (テンプレート文字列リテラル)
Python 3.14 で追加された t-string は t"..." と書くリテラルです。f-string と違って、評価した結果は文字列 (str) ではなく string.templatelib.Template オブジェクトになります。固定の文字列部分と、埋め込んだ値を別々に持っているので、値だけをエスケープするなど、安全な文字列の組み立てに使えます。
・strings: 固定の文字列部分のタプル
・values: 埋め込んだ式の値のタプル
・interpolations: 埋め込み部分 (Interpolation) のタプル。value (値)・expression (式のテキスト)・conversion (!r なら 'r')・format_spec (書式) を持つ
・for で回すと、文字列と Interpolation が順に取り出される
t-string では、書式や変換は自動では適用されません。処理する側が format_spec などを見て整形します。また Template と str を + でつなぐと TypeError になります。
from string.templatelib import Interpolationdef html(template): parts = [] for item in template: if isinstance(item, Interpolation): value = str(item.value).replace("<", "<").replace(">", ">") parts.append(value) else: parts.append(item) return "".join(parts)name = "<script>"t = t"<p>こんにちは、{name} さん</p>"print(type(t).__name__, t.strings, t.values)print(html(t))print(f"<p>こんにちは、{name} さん</p>")python3 main.py Template ('<p>こんにちは、', ' さん</p>') ('<script>',) <p>こんにちは、<script> さん</p> <p>こんにちは、<script> さん</p>
f-string は埋め込んだ値もそのまま文字列にしてしまうので、HTML のタグが入ってしまいます。t-string なら、値の部分だけをエスケープできます。
正規表現 (re)
パターンは、バックスラッシュをそのまま書ける raw 文字列 (r"\d+") で書くのが基本です。主な関数の違いは次のとおりです。
・re.match: 文字列の先頭からマッチするか。マッチしなければ None
・re.search: 文字列全体から最初にマッチする箇所
・re.fullmatch: 文字列全体がパターンに一致するか
・re.findall: マッチしたものすべてのリスト。グループが 1 つならグループの部分、2 つ以上ならタプルのリスト
・re.sub(パターン, 置換, 文字列, count=回数): 置換。置換後の文字列で \1 などの後方参照が使え、関数も渡せる
・re.split: 正規表現で分割
・re.compile: パターンをコンパイルして、何度も使う
マッチオブジェクトからは、group() (全体)・group(1) や m[1] (グループ)・groupdict() (名前付きグループの辞書)・span() (位置) を取り出せます。名前付きグループは (?P<名前>...) と書きます。
import relog = "2026-12-01 ERROR db: timeout\n2026-12-02 INFO web: ok"pattern = re.compile(r"^(?P<date>\S+) (?P<level>[A-Z]+) (\w+):", re.MULTILINE)print([m["level"] for m in pattern.finditer(log)])m = pattern.search(log)print(m.groupdict(), m.group(3), m.span())print(re.findall(r"(\d+)-(\d+)", "03-1234, 06-5678"))print(re.sub(r"(\d{4})-(\d{2})-(\d{2})", r"\2/\3/\1", "2026-12-01"))print(re.match(r"\d", "a1"), re.fullmatch(r"\d+", "123") is not None)python3 main.py ['ERROR', 'INFO'] {'date': '2026-12-01', 'level': 'ERROR'} db (0, 20) [('03', '1234'), ('06', '5678')] 12/01/2026 None True
*・+ は既定では最長一致 (greedy) で、後ろに ? を付けた *?・+? は最短一致です。<.+> は <b>text</b> 全体にマッチしますが、<.+?> は <b> と </b> に別々にマッチします。フラグは re.IGNORECASE (大文字小文字を区別しない)・re.MULTILINE (^・$ が各行に一致)・re.DOTALL (. が改行にも一致) などで、| で組み合わせます。
Unicode データベース (unicodedata)
unicodedata.normalize("NFKC", 文字列) は、互換文字を標準的な文字にそろえる正規化です。全角英数字は半角に、半角カタカナは全角に (濁点も 1 文字にまとめて) 変換されるので、入力の表記ゆれをそろえるのに使います。
ほかに、name() で文字の Unicode 名、category() で文字の種類 (Lu は大文字、Nd は 10 進数字など) を調べられます。
import unicodedatatext = "PYTHON 3.14 テスト"print(unicodedata.normalize("NFKC", text))print(unicodedata.name("A"), unicodedata.category("A"), unicodedata.category("3"))print("3".isdigit(), int("3") + 1)python3 main.py PYTHON 3.14 テスト FULLWIDTH LATIN CAPITAL LETTER A Lu Nd True 4
isdigit() や int() は全角の数字も数字として扱います。数字の入力を検証するときは、正規化してから判定すると安全です。
試験でよくある引っかけ
split(",")とsplit()の違い区切りを指定すると連続した区切りの間は空文字列になり、引数なしでは連続する空白がまとめられます。
stripの引数は文字の集合strip("abc")は、a・b・cのどれかが続く限り両端から取り除きます。決まった文字列を取り除くのはremoveprefix・removesuffixです。findとindex見つからないとき、
findは-1を返し、indexはValueErrorを発生させます。t-string は文字列ではない
t"..."はTemplateオブジェクトで、print()しても埋め込んだ値の入った文字列にはなりません。書式も自動では適用されません。re.matchは先頭だけre.matchは文字列の先頭からしか探しません。途中を探すのはre.searchです。findallとグループパターンにグループがあると、
findallはマッチ全体ではなくグループの部分を返します。最長一致と最短一致
.+は最長一致です。タグを 1 つずつ取り出すには.+?を使います。
問題で確認する
この分野の問題を、解説つきで読めます (登録不要)。
出典・参考
- Python エンジニア育成推進協会「Python 実践試験」(出題範囲)
- Python ドキュメント「組み込み型 (文字列メソッド)」
- Python ドキュメント「string.templatelib」
- Python ドキュメント「re」
- Python ドキュメント「unicodedata」
コード例は、実際に実行して結果を確認しています。