この記事について
Pythonで文字列を扱って何かする際の色々を覚え書き的に順次追記していきます。
正規表現を使ったパターンマッチ
正規表現チートシート
パターンマッチとマッチ部分の抽出
以下のようなファイルから、学習曲線を描くための情報を抽出したいとする。
ファイル
(省略)
2021-01-18 13:48:13 3784964 parameters in model
2021-01-18 13:54:34 # =====> Epoch: 1 Average gen loss = 1.02231, KLD = 0.924802, total loss = 1.022387; Finished in 0:06:20.245799
2021-01-18 14:01:29 # =====> Epoch: 2 Average gen loss = 1.01518, KLD = 1.224245, total loss = 1.015275; Finished in 0:06:22.065888
2021-01-18 14:08:19 # =====> Epoch: 3 Average gen loss = 1.01342, KLD = 1.943195, total loss = 1.013566; Finished in 0:06:20.048240
(省略)
re モジュールの match 関数を使う。
m = re.match(<パターン文字列>, <検索対象文字列>)
パターン文字列の中の特定の部分(数字とか)を後から取り出したいときは、パターン文字列の中の当該部分を()
でくくっておく。
コード
log = []
for line in open(log_file):
# マッチ結果が返ってくるので変数で受け取る
m = re.match(r'.+Epoch:\s*(\d*)\s*Average gen loss =\s*(\d*\.\d*), KLD =\s*(\d*\.\d*),\s*total loss =\s*(\d*\.\d*).*', line)
# マッチしていない場合は None が入っているんでスルー
if m is not None:
# m.group(0)は文字列全体、m.group(N) (N>0)はパターン文字列の中で()でくくった部分が入っている
log.append(dict(
epoch=int(m.group(1)),
average_gen_loss=float(m.group(2)),
kld=float(m.group(3)),
total_loss=float(m.group(4))
))
df_log = pd.DataFrame(log)
# pip install tabulate しておけばmarkdown形式で表出力できます
print(df_log.to_markdown())
出力
epoch | average_gen_loss | kld | total_loss | |
---|---|---|---|---|
0 | 1 | 1.02231 | 0.924802 | 1.02239 |
1 | 2 | 1.01518 | 1.22425 | 1.01527 |
2 | 3 | 1.01342 | 1.9432 | 1.01357 |
3 | 4 | 1.01169 | 2.33714 | 1.01187 |