Python入門③:正規表現でslackの数値とStartpoint/Endpointを抽出

Parser

〜Timing Reportを数値とペアで扱えるようにする〜

📝 はじめに

これまでの記事では、

  • ファイルの読み込みと行数・文字数カウント
  • grepのようにキーワードを含む行を抽出

を学んできました。
今回はさらに一歩進めて、Timing Reportから「数値だけ」や「ペアの情報」を正規表現で抽出する方法を紹介します。


🎯 やりたいこと

  1. slack 行から 数値だけ を抜き出す
  2. StartpointEndpoint をセットで取り出す

これができると、「どのパスで slack が何nsか」を一覧にできるようになります。


✍️ コード例

以下のスクリプトを extract_info.py として保存してください。

#```python
#extract_info.py
#Timing Reportからslack数値とStartpoint/Endpointを抽出する

import re

filename = "timing_sample.rpt"

with open(filename, "r", encoding="utf-8") as f:
    text = f.read()

#1. slack の数値を抽出

slack_pattern = r"slack.?([-+]?\d.?\d+)"
slack_matches = re.findall(slack_pattern, text, flags=re.IGNORECASE)

#2. Startpoint と Endpoint を抽出

start_pattern = r"Startpoint:\s(.+)" end_pattern = r"Endpoint:\s(.+)"

start_matches = re.findall(start_pattern, text)
end_matches = re.findall(end_pattern, text)

# 出力
print("=== Slack values ===")
for s in slack_matches:
    print("slack:", s)

print("\n=== Startpoint / Endpoint pairs ===")
for sp, ep in zip(start_matches, end_matches):
    print(f"Startpoint: {sp} -> Endpoint: {ep}")

実行方法

ターミナルで次のコマンドを実行します。

python extract_info.py

出力例:

=== Slack values ===
slack: 0.11

=== Startpoint / Endpoint pairs ===
Startpoint: U1/clk (rising edge-triggered flip-flop clocked by CLK)  ->  Endpoint: U5/data (rising edge-triggered flip-flop clocked by CLK)

🔍 解説

  • 正規表現(Regex)
    • slack.*?([-+]?\d*\.?\d+)
      • slack の後に出てくる数値(整数・小数・±符号)を抽出
    • Startpoint:\s*(.+)
      • Startpoint: の後ろに続く文字列をすべて取得
  • re.findall()
    • マッチしたものをリストで返してくれる便利関数
  • zip(start_matches, end_matches)
    • StartpointとEndpointをペアでまとめてループ

💡 応用ポイント

  • 複数パスがある場合でも、StartpointとEndpointをペアで対応付け可能
  • Slack値と組み合わせれば「Startpoint → Endpoint の Slack値一覧」を作れる
  • CSV出力にすればExcelで簡単に分析可能

✅ まとめ

  • 正規表現を使えば slackの数値だけ 抜き出せる
  • StartpointとEndpointをセットで取得できるようになった
  • これで 「どのパスのSlackが何か」 を整理できる基礎が整った
タイトルとURLをコピーしました