我正在关注带有正则表达式的数据。我正在使用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')
答案 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')]