Kodrill

テキストの処理

Python 3 エンジニア認定実践試験

str・string・f-string・t-string・正規表現 (re)・unicodedata

問題数
18 問
合格ライン
70%
実行して確認済み
15 問
この分野の要点を読む6 章・約 12 分。実行して確かめたコード例と、試験でよくある引っかけをまとめています

ログインなしで試す

無料の 5 問を、1問ごとに正誤と解説を見ながら解けます。解答は保存されません。

5 問を試す

無料登録して学習を記録する

学習履歴・ダッシュボード・ブックマーク・模試モードが使えます。

★ 残り 13 問はプレミアム会員限定です

無料プランでは先頭 5 問まで解けます。プレミアムなら全問題・苦手問題の復習・広告非表示が使えます。
料金プランを見る

問題と解説を見る (無料)

登録しなくても、次の5問は問題文と解説をそのまま読めます。

テキストの処理の要点

内容の確認日: 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 はタプルで複数の候補を指定できる

Python
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() で変換し、文字列は引用符付きになります。{式=} と書くと、式のテキストと値を 式=値 の形で出力でき、デバッグに便利です (= の後に書式も書けます)。

Python
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 になります。

Python
from string.templatelib import Interpolation​def html(template):    parts = []    for item in template:        if isinstance(item, Interpolation):            value = str(item.value).replace("<", "&lt;").replace(">", "&gt;")            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>こんにちは、&lt;script&gt; さん</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<名前>...) と書きます。

Python
import re​log = "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 進数字など) を調べられます。

Python
import unicodedata​text = "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 つずつ取り出すには .+? を使います。

問題で確認する

この分野の問題を、解説つきで読めます (登録不要)。

出典・参考

コード例は、実際に実行して結果を確認しています。