如何用十六进制值制作正确的正则表达式?

时间:2019-02-02 13:32:18

标签: python

我正在关注带有正则表达式的数据。我正在使用python,并且实现了此功能:

import re
exp = r"\bTimestamp\s+([0-9]+)\s+ID=(\w{32})0*\s+Dest_ID=(\w{32})0*\sASN_Received\s+(?!0000)[0-9A-F]{4}+"
rx = re.compile(exp)
m=rx.match("Timestamp 1549035123  ID=02141592cc0000000300000000000000 Dest_ID=00000000000000000000000000000000 Nbr_Received = ec30000000")
m.groups()
print(m.groups())

但是它不能正常工作:

我希望得到以下结果:

('1549033267', '02141592cc0000000500000000000000','00000000000000000000000000000000','ec30000000')

然后我要使用此函数将十六进制值转换为十进制:

def Convert_Decimal(nbr_hex):
nbr_dec = nbr_hex[5] + nbr_hex[2:4] + nbr_hex[0:2]
reversed = int(nbr_dec, 16)
print(reversed)

作为最终结果,我希望拥有:

('1549033267', '02141592cc0000000500000000000000','00000000000000000000000000000000','12524')

2 个答案:

答案 0 :(得分:1)

十六进制值仅使用数字0-9和字母A至F(大写或小写),并且在您的情况下具有固定的长度,因此[0-9a-fA-F]{32}足以匹配这些值。当您具有固定长度的值时,不需要匹配尾随零。

您真的不想在这里使用\w,也不想匹配下划线,其余的英语字母或Unicode标准中的任何其他类似字母的符号(有数千个)

接下来,您正在寻找ASN_Received,但是您的输入字符串使用文本Nbr_Received =,在=字符周围带有空格。为此:

exp = (
    r'\bTimestamp\s+([0-9]+)\s+'
    r'ID=([0-9a-fA-F]{32})\s+'
    r'Dest_ID=([0-9a-fA-F]{32})\s+'
    r'Nbr_Received\s*=\s*([0-9a-fA-F]{4,})'
)

我将表达式分成多行以使其易于理解。请注意,我使用{4,}作为最后一个十六进制值,匹配4个或更多个数字。您不能同时使用+{n,m}模式,选择一个或另一个。

您将得到:

>>> import re
>>> exp = (
...     r'\bTimestamp\s+([0-9]+)\s+'
...     r'ID=([0-9a-fA-F]{32})\s+'
...     r'Dest_ID=([0-9a-fA-F]{32})\s+'
...     r'Nbr_Received\s*=\s*([0-9a-fA-F]{4,})'
... )
>>> rx = re.compile(exp)
>>> m = rx.match("Timestamp 1549035123  ID=02141592cc0000000300000000000000 Dest_ID=00000000000000000000000000000000 Nbr_Received = ec30000000")
>>> print(m.groups())
('1549035123', '02141592cc0000000300000000000000', '00000000000000000000000000000000', 'ec30000000')

另请参见this online demo at regex101,它在右侧说明了图案的每个部分。

我将通过bytes.fromhex()int.from_bytes()将最后一个十六进制数转换为整数:

>>> m.group(4)
'ec30000000'
>>> bytes.fromhex(m.group(4))
b'\xec0\x00\x00\x00'
>>> int.from_bytes(bytes.fromhex(m.group(4)), 'little')
12524

答案 1 :(得分:-2)

尝试一下:

>>> import re
>>> string = "Timestamp 1549035123  ID=02141592cc0000000300000000000000 Dest_ID=00000000000000000000000000000000 Nbr_Received = ec30000000"
>>> pat = r'Timestamp\s+(\d+)\s+ID=(\w+)\s+Dest_ID=(\d+)\s+Nbr_Received\s+?=\s+?(\w+)'
>>> re.findall(pat, string)
[('1549035123', '02141592cc0000000300000000000000', '00000000000000000000000000000000', 'ec30000000')]