Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでscanf()メソッドをシミュレートする方法をわかりやすく解説

Python公式ドキュメントの記述について

Pythonには、C言語でおなじみのscanf()に直接相当する関数が現在用意されていません。そのため、入力文字列の解析を行いたい場合は、代わりに正規表現(reモジュール)を使うのが標準的なアプローチです。

正規表現はscanf()のフォーマット文字列よりもはるかに柔軟で強力である反面、記述がやや冗長になるという特徴があります。しかし、一度パターンの書き方に慣れてしまえば、より複雑な解析にも対応できるようになります。

以下の表は、scanf()のフォーマット指定子と、それにほぼ相当する正規表現の対応関係をまとめたものです。

scanf()フォーマット指定子と正規表現の対応表

scanf()の指定子対応する正規表現
%c
.
%5c
.{5}
%d
[-+]?\d+
%e, %E, %f, %g
[-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?
%i
[-+]?(0[xX][\dA-Fa-f]+|0[0-7]*|\d+)
%o
[-+]?[0-7]+
%s
\S+
%u
\d+
%x, %X
[-+]?(0[xX])?[\dA-Fa-f]+

具体例:ファイル名と数値を抽出する

たとえば、次のような文字列からファイル名とエラー・警告の件数を取り出したいとします。

/usr/sbin/sendmail - 0 errors, 4 warnings

この場合、C言語なら次のようなscanf()フォーマットを使用します。

%s - %d errors, %d warnings

これをPythonの正規表現に置き換えると、以下のようになります。

(\S+) - (\d+) errors, (\d+) warnings

実際のPythonコード例

reモジュールを使った実装例は次のとおりです。括弧でグループ化した部分が、match.group()で個別に取得できます。

import re

text = "/usr/sbin/sendmail - 0 errors, 4 warnings"
pattern = re.compile(r"(\S+) - (\d+) errors, (\d+) warnings")

match = pattern.match(text)
if match:
    filename = match.group(1)  # ファイル名
    errors = int(match.group(2))  # エラー数
    warnings = int(match.group(3))  # 警告数

    print(filename, errors, warnings)
# 出力例: /usr/sbin/sendmail 0 4

このように、scanf()の各指定子を正規表現に置き換え、キャプチャグループと組み合わせることで、PythonでもC言語のscanf()と同等の文字列解析を簡単に実現できます。

  1. PythonでROC曲線をプロットする方法をわかりやすく解説

    ROC曲線とは?ROC(Receiver Operating Characteristic:受信者動作特性)曲線は、分類モデルの性能を視覚的に評価するためのグラフです。横軸に偽陽性率(FPR)、縦軸に真陽性率(TPR)を取り、モデルの識別能力を直感的に確認できます。scikit-learnでは metrics.plot_roc_curve(clf, X_test, y_test) メソッドを使うことで、学習済みモデルから簡単にROC曲線を描画できます。ROC曲線をプロットする手順分類用データセットの生成make_classification() メソッドを使用して、ランダムなnクラス分類問題の

  2. PythonでGETメソッドを使用して情報を渡す方法【CGIプログラミング入門】

    GETメソッドとはGETメソッドは、エンコードされたユーザー情報をページリクエストに付加して送信する方式です。ページのURLとエンコードされた情報は「?」記号で区切られます。https://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2GETメソッドは、ブラウザからWebサーバーへ情報を渡す際のデフォルトの方法であり、送信した内容はブラウザのアドレスバー(Locationボックス)に長い文字列として表示されます。そのため、パスワードなどの機密情報をサーバーに送る場合には、GETメソッドは絶対に使用しないでください。また、GET