Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

subとグループの参照を使って、順番を並び替えた新データをつくる

Python正規表現ライブラリ"re"は機能が充実しています。
文字列の置き換えに使うsub関数とグループ参照を併用すると必要部分を抽出して並び替え……みたいな事は割りとスマートにいけます。

実際のところ

こんな例があったとします。*1

  • データは次の形式でくる"%{16進数表記_い}!{16進数表記_ろ}!{16進数表記_は}%"という形式でくる
  • 出力形式はJSON"{"data_a":{16進数_は}, "data_b":{16進数_い}}"

泥臭くやると、searchして変数に格納、format関数なりで整形……という手が感が付きます。
ここでsubとグループの参照を使ってやると、割りかしスッキリ書くことができます。
……もっといい方法がありそうですけどね。

query = b'%([0-9a-f]{2,})!([0-9a-f]{2,})!([0-9a-f]{2,})%\n'
result = b'{"data_a":"0x\g<3>", "data_b":"0x\g<1>"}'
rcvdPckt = b'%ac2!2ab4!f5%\n'
re.sub(query, result, rcvdPckt)
#>> b'{"data_a":"0xf5", "data_b":"0xac2"}'

*1:実際やった例は、こんな狂ったパケットでは無かったですが