我有一个字符串"call 0x558f to add 0xaaef"
,我想将该字符串中的十六进制数字更改为十进制数字,然后打印出重新插入这些数字的结果,如"call xxxx to add xxxx"
。
我试着像这样编码:
# coding=utf-8
import re
__author__ = 'sudo'
def hextodecimal(match):
print "Return the decimal number for hex string"
print match.group()
vaule = int(hex(match.group()),16)
return vaule
p = re.compile(r"\b0[xX][0-9a-fA-F]+\b ")
print p.sub(hextodecimal, "call 0x568a to add 0x333f")
虽然我设法提取"0x568a"
部分,但是有一个错误:
Return the decimal number for hex string
0x568a
Traceback (most recent call last):
File "F:/pythonProject/Guessnumber/hextooct.py", line 15, in <module>
print p.sub(hextodecimal, "call 0x568a to add 0x333f")
File "F:/pythonProject/Guessnumber/hextooct.py", line 11, in hextodecimal
vaule = int(hex(match.group()),16)
TypeError: hex() argument can't be converted to hex
我该如何解决?
答案 0 :(得分:1)
您需要删除hex()
电话;该函数用于生成十六进制输出,而不是解析它。
将匹配文本的十六进制数字部分分组,然后只将该部分传递给int(..., 16)
,然后将该解析后的整数转换为字符串:
def hextodecimal(match):
return str(int(match.group(1), 16))
p = re.compile(r"\b0[xX]([0-9a-fA-F]+)\b")
print p.sub(hextodecimal, "call 0x568a to add 0x333f")
我也从你的模式中删除了尾随空格。
演示:
>>> import re
>>> def hextodecimal(match):
... return str(int(match.group(1), 16))
...
>>> p = re.compile(r"\b0[xX]([0-9a-fA-F]+)\b")
>>> p.sub(hextodecimal, "call 0x568a to add 0x333f")
'call 22154 to add 13119'
答案 1 :(得分:0)
使用0x前缀,Python可以自动区分十六进制和十进制。
print int(“0xdeadbeef”,0)
3735928559
print int(“10”,0)
10