Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

【読書メモ】詳説 正規表現 第3版

詳説 正規表現 第3版

詳説 正規表現 第3版

再帰表現と正規表現を書き下しできればエンジニアの上位20%という説がまことしやかに囁かれております。
その真偽はともかく、正規という奴はそれ自体が極めて強力なツールです。

本書はその正規表現について、方言まで含めて幅広く扱っている本になります。

ctypeライブラリでC言語めいたメモリ領域の確保を行う

実際のところ

from ctypes import *

p = create_string_buffer(b"Hi", 10) # 10文字分確保し先頭にHiをいれる
print( repr(p.raw) )
#>>> b'Hi\x00\x00\x00\x00\x00\x00\x00\x00'

参考もと

docs.python.org

pack_into / unpack_fromメソッドをつかってC言語風にデータを格納する

structのpack_into/unpack_fromメソッドをつかうと、C言語のような感じでメモリ領域を確保、読み出しが可能です。
何らかの事情で保存領域の使用がタイトだったりとか、C言語で実装されたプロジェクトをPythonで書き換えたりするときに使えますね。

実際のところ

メモリ確保にはctypesを使いますが、arrayもいけるらしいです。

import struct
import ctypes

style = 'hhl'
size = struct.calcsize(style)

# 保存するデータ枠の指定
buff = ctypes.create_string_buffer(size)

# buffにつめる
struct.pack_into(style, buff, 0, *(5, 10, 2))

# buffのなかみを呼び出す
struct.unpack_from(style, buff, 0)
#>> (5, 10, 2)

structライブラリでバイト列をつくる

前回の記事でバイトリテラルを分解するunpackメソッドと対になるpackメソッドを使うと
バイトリテラルを結合したり、バイト埋めができたりします。
…………これ、散々苦労したPythonでのバイト列生成では決定版かも……。

実際のところ

import struct
struct.pack('h', 1)
#>> b'\x00\x01'

複数個指定することも可能。

struct.pack('HH', 0xdead,0xbeef)
#>> b'\xad\xde\xef\xbe'

バイトリテラル列の分解

実際のところ

標準ライブラリstructのunpackメソッドを使います。

import struct
struct.unpack('8B', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
#>> 255
struct.unpack('8B', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[1]
#>> 248