Python環境を起動中... 初回のみ数秒かかります
Lesson 9 / 20

文字列の応用

このレッスンで学ぶこと

  • f-string で変数を文字列に埋め込み、数値を整形できる
  • split()/join() でCSV行の分解・結合ができる
  • strip()/replace()/find() で文字列をクリーニングできる
  • startswith()/endswith() でファイル名や拡張子を判定できる

1. f-string(フォーマット文字列)

f"..." の中で {変数} と書くと、変数の値が埋め込まれます。 {変数:.2f} のように 書式指定子 を使うと小数点の桁数や ゼロ埋め、幅揃えも指定できます。 ログ出力・レポート生成・デバッグプリントで毎日使う機能です。

sample_1.py
Ctrl+Enter
出力

💡 よく使う書式指定子: :.2f(小数点2桁)、 :05d(5桁ゼロ埋め整数)、 :>10(右揃え幅10)、 :<10(左揃え幅10)、 :,(千区切りカンマ)、 :.1%(パーセント表示)。

2. split() と join()

split(区切り文字) は文字列を区切って リストに変換 します。 join(リスト) はリストを文字列に 連結 します。 CSVファイルの解析やデータのパースで毎回使います。

パース(parse)とは、文字列のかたまりを意味のある部品に分解して取り出す処理のことです。 たとえば "田中,58,A+" という1行の文字列を、名前・年齢・血液型の3つに分けるのがパースです。

sample_2.py
Ctrl+Enter
出力

join() に数値リストを渡すとエラーになります:
join()文字列のリストだけを連結できます。数値(int / float)が混ざっていると TypeError が発生します。

values = [6200, 420, 13.5, 22]

",".join(values)                    # TypeError! 数値は文字列ではない
",".join(str(v) for v in values)    # OK: str() で文字列に変換してから渡す

str(v) for v in values は「各要素を1つずつ str() に通す式」です。 詳しくはレッスン12「内包表記」で学びますが、今は「数値リストを join() するときは str() 変換が必要」と覚えておきましょう。

💡 split() の引数なし: s.split()(引数なし)は空白・タブ・改行をまとめて区切り文字として扱い、 先頭・末尾の空白も除去します。 ログ行のパースに非常に便利です。

3. strip・replace・find・大文字小文字変換

テキストデータのクリーニングは実務で避けられません。 外部システムから取得したデータには余分な空白、大文字小文字の揺れ、 不要な文字が混入していることがよくあります。

sample_3.py
Ctrl+Enter
出力

4. startswith・endswith・文字列判定

startswith("文字列") は文字列が指定した文字で始まるかendswith("文字列") は指定した文字で終わるかを確認し、 TrueFalse を返します。 if f.endswith(".dcm"): のように if と組み合わせるのが典型的な使い方です。

find() や文字列のスライスでも同じことはできますが、 startswith/endswith意図が一目でわかるという点で優れています。 医療AIの実装では .dcm(DICOM)・.nii.gz(NIfTI MRI)・ .csv など複数のファイル形式を扱うことが多く、この判定が頻繁に登場します。

sample_4.py
Ctrl+Enter
出力

💡 isdigit / isalpha / isalnum の意味:

  • str.isdigit():文字列が数字のみで構成されているとき True"123" → True、"12.3" → False(小数点はNG)
  • str.isalpha():文字列がアルファベット(または文字)のみのとき True"abc" → True、"P001" → False(数字が混じるとNG)
  • str.isalnum():文字列が英数字のみのとき True"P001" → True、"P-001" → False(ハイフン等の記号が混じるとNG)

入力値の検証(バリデーション)でよく使います。例:患者IDが英数字のみかチェックする、年齢の入力欄が数字だけかを確認するなど。

💡 os.path と pathlib: ファイルパスを本格的に扱う場合は os.pathpathlib.Path モジュールを使いましょう。 Path("file.dcm").stem で拡張子なしのファイル名を取得できます。 今はまず文字列操作の基礎を押さえてください。

5. 練習問題

問題 1

患者情報をf-stringでフォーマット表示する

変数 name="佐藤 次郎"age=71bmi=24.87 を使って、 以下の形式で出力してください:
患者: 佐藤 次郎(71歳)|BMI: 24.87(正常)

exercise_1.py
出力
ヒントを見る(答え+解説)
name = "佐藤 次郎"
age  = 71
bmi  = 24.87

status = "肥満" if bmi >= 25.0 else "正常"
print(f"患者: {name}({age}歳)|BMI: {bmi:.2f}({status})")
# → 患者: 佐藤 次郎(71歳)|BMI: 24.87(正常)

{変数:.2f} は小数点以下2桁に丸める書式指定で、BMIや検査値の表示でよく使います。条件式(三項演算子)と組み合わせることで、計算結果をそのまま1行で整形できます。

問題 2

CSV1行をsplitして値を取り出す

下のCSV行を split(",") で分解し、 患者IDと収縮期血圧(sbp)を変数に代入して出力してください。

exercise_2.py
出力
ヒントを見る(答え+解説)
csv_line = "P003,佐藤 次郎,71,138,88,72"
# フィールド順: ID, 名前, 年齢, 収縮期血圧(sbp), 拡張期血圧(dbp), 心拍数

fields = csv_line.split(",")
pid = fields[0]
sbp = int(fields[3])
print(f"患者 {pid}: 収縮期血圧 = {sbp} mmHg")
# → 患者 P003: 収縮期血圧 = 138 mmHg

split(",") でCSV文字列をリストに分割し、インデックスで各フィールドを取り出します。int() でキャストしないと文字列のまま計算できないので忘れずに。

問題 3

ファイルリストからDICOMファイルだけを抽出する

リスト中のファイル名から .dcm で終わるものだけを for ループで抽出し、 リスト dcm_files に追加して出力してください。

exercise_3.py
出力
ヒントを見る(答え+解説)
file_list = [
    "img_001.dcm", "report.pdf", "img_002.dcm",
    "notes.txt",   "img_003.dcm", "metadata.json"
]

dcm_files = []
for filename in file_list:
    if filename.endswith(".dcm"):
        dcm_files.append(filename)

print(f"DICOMファイル: {len(dcm_files)} 件")
print(dcm_files)
# → DICOMファイル: 3 件
# → ['img_001.dcm', 'img_002.dcm', 'img_003.dcm']

endswith(".dcm") で拡張子を判定し、条件を満たすものだけを append() で集めるフィルタリングパターンです。医療AIでDICOMファイルを選別する実務でそのまま使えます。

まとめ

このレッスンのポイント

  • f"{変数:.2f}" で数値の桁数や幅を指定してフォーマットできる
  • split(区切り) で文字列をリストに、"区切り".join(リスト) でリストを文字列に
  • strip() で前後の空白除去、replace(a, b) で文字列置換
  • startswith()/endswith() でプレフィックス・拡張子を判定できる
  • find() で部分文字列の位置を取得(なければ -1
  • lower()/upper() で大文字小文字を統一してから比較するのが定石

自由に試してみましょう:

free_practice.py
Ctrl+Enter
出力

完了するとトップページに進捗が表示されます