1 つのオプションは、parser
モジュールを使用することです。
import parser, token, re
def hexify(ast):
if not isinstance(ast, list):
return ast
if ast[0] in (token.NAME, token.NUMBER) and re.match('[0-9a-fA-F]+$', ast[1]):
return [token.NUMBER, '0x' + ast[1]]
return map(hexify, ast)
def hexified_eval(expr, *args):
ast = parser.sequence2st(hexify(parser.expr(expr).tolist()))
return eval(ast.compile(), *args)
>>> hexified_eval('id*10 + BABE', {'id':0xcafe})
567466
これは、名前または数値として明確に識別された (そして 16 進数のように見える) トークンのみを置き換えようとするという点で、正規表現ソリューションよりもいくらかクリーンです。また、( に置き換えられid*10 + len('BABE')
ません)などのより一般的な python 式も正しく処理します。'BABE'
'0xBABE'
OTOH、正規表現ソリューションはよりシンプルであり、とにかく対処する必要があるすべてのケースをカバーする可能性があります.