如何在re.sub中更改十进制数的十六进制数

时间:2016-11-02 10:23:09

标签: python regex

我有一个字符串"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

我该如何解决?

2 个答案:

答案 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