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()と同等の文字列解析を簡単に実現できます。
-
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クラス分類問題の
-
PythonでGETメソッドを使用して情報を渡す方法【CGIプログラミング入門】
GETメソッドとはGETメソッドは、エンコードされたユーザー情報をページリクエストに付加して送信する方式です。ページのURLとエンコードされた情報は「?」記号で区切られます。https://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2GETメソッドは、ブラウザからWebサーバーへ情報を渡す際のデフォルトの方法であり、送信した内容はブラウザのアドレスバー(Locationボックス)に長い文字列として表示されます。そのため、パスワードなどの機密情報をサーバーに送る場合には、GETメソッドは絶対に使用しないでください。また、GET