[英]Regex to match part of a hex
所以我需要使用正则表达式来匹配十六进制字符串的一部分,但那部分是随机的。 让我试着解释更多:
所以我有这个六边形数据:
70 75 62 71 00 7e 00 01 4c 00 06 72 61 6e 64 6f 6d 74 00 1c 4c 6a 2f 73 2f 6e 64 6f 6d 3b 78 70 77 25 00 00 00 20 f2 90 c2 91 c4 c4 ca 91 c0 c0 ca 91 94 cb c5 97 90 c5 90 c2 90 96 c7 ca 91 91 93 94 c6 c5 c6 cb c0 78
在那种情况下,我只需要匹配 f2 。 但情况并非总是如此。 每个数据都会不同。 唯一始终相同的是“00 00 00”部分和末尾的“78”。 所有 rest 都是随机的。
我设法制作了以下正则表达式:/(?=00 00 00).+?(?=78)/ output 是:
00 00 00 20 f2 90 c2 91 c4 c4 ca 91 c0 c0 ca 91 94 cb c5 97 90 c5 90 c2 90 96 c7 ca 91 91 93 94 c6 c5 c6 cb c0
但我不知道如何构建一个正则表达式来只接受“f2”(提醒:并不总是 f2)
有什么想法吗?
f2
是否被星号包围?
没有星号:
00 00 00 [a-f0-9]+ (?<hexits>[a-f0-9]+).+78
带星号:
\*(?<hexits>[a-f0-9]+)\*
您可以使用以下正则表达式来匹配“00 00 00”之后的十六进制值:/00 00 00 ([0-9A-Fa-f]{2})/。 您想要的值在捕获组中,由 \1 表示。
这是一个演示:
import re
s = '70 75 62 71 00 7e 00 01 4c 00 06 72 61 6e 64 6f 6d 74 00 1c 4c 6a 2f 73 2f 6e 64 6f 6d 3b 78 70 77 25 00 00 00 20 f2 90 c2 91 c4 c4 ca 91 c0 c0 ca 91 94 cb c5 97 90 c5 90 c2 90 96 c7 ca 91 91 93 94 c6 c5 c6 cb c0 78'
match = re.search(r'00 00 00 ([0-9A-Fa-f]{2})', s)
if match:
print(match.group(1))
output 将是:
f2
你真的不需要正则表达式。 获取连续 3 个字节为零的偏移量并取其后的第 4 个:
s = '70 75 62 71 00 7e 00 01 4c 00 06 72 61 6e 64 6f 6d 74 00 1c 4c 6a 2f 73 2f 6e 64 6f 6d 3b 78 70 77 25 00 00 00 20 f2 90 c2 91 c4 c4 ca 91 c0 c0 ca 91 94 cb c5 97 90 c5 90 c2 90 96 c7 ca 91 91 93 94 c6 c5 c6 cb c0 78'
s2 = '01 02 03 00 00 00 05 06 07'
def locate(s):
data = bytes.fromhex(s)
offset = data.find(bytes([0,0,0]))
return data[offset + 4]
print(f'{locate(s):02X}')
print(f'{locate(s2):02X}')
Output:
F2
06
您还可以直接从字符串中提取“f2”字符串:
offset = s.index('00 00 00')
print(s[offset + 12 : offset + 14]) # 'f2'
鉴于此评论中的解释,您需要的正则表达式是:
(?<=00 00 00 [0-9a-f]{2} )[0-9a-f]{2}
提供问题中的第一个输入字符串,此正则表达式匹配f2
(周围没有空格)。
上网查一下。
怎么运行的:
(?<= # start of a positive lookbehind
00 00 00 # match the exact string ("00 00 00 ")
[0-9a-f] # match one hex digit (lowercase only)
{2} # match the previous twice (i.e. two hex digits)
# there is a space after ")"
) # end of the lookbehind
[0-9a-f]{2} # match two hex digits
积极的后视就像一个非捕获组,但它不是匹配的一部分。 基本上,它表示匹配部分 ( [0-9a-f]{2}
) 只有在它前面有 lookbehind 表达式的匹配项时才匹配。
表达式的匹配部分是[0-9a-f]{2}
(即两个十六进制数字)。
您需要添加i
或使用您用来表示“忽略大小写”的正则表达式引擎的任何标志(即正则表达式的af
部分也匹配AF
)。 如果你不能(或不想)提供这个标志,你可以把[0-9A-Fa-f]
放在任何地方并且它有效。
如果您的正则表达式引擎不支持 lookbehind,您可以使用捕获组获得相同的结果:
00 00 00 [0-9a-f]{2} ([0-9a-f]{2})
应用于相同的输入,这个正则表达式匹配00 00 00 20 f2
并且它的第一个(也是唯一的)捕获组匹配f2
。
上网查一下。
如果输入字符串在匹配部分之后某处包含78
很重要,则将(?=(?: [0-9a-z]{2})* 78)
添加到第一个正则表达式:
(?<=00 00 00 [0-9a-f]{2} )[0-9a-f]{2}(?=(?: [0-9a-z]{2})* 78)
(?=
引入了正向前瞻。它的行为类似于后视,但必须位于 reged 的匹配部分之后,并且它针对位于字符串匹配部分之后的字符串部分进行验证。
(?:
启动一个非捕获组。
[0-9a-z]{2}
在前瞻和后视中后跟或前跟一个空格确保整个匹配字符串仅由 2 个由空格分隔的十六进制数字组成。 您可以改用.*
,但它会匹配任何内容,即使它们不遵循 2 个十六进制数字的格式。
对于没有先行或后行的版本,在正则表达式的末尾添加(?: [0-9a-z]{2})* 78
:
00 00 00 [0-9a-f]{2} ([0-9a-f]{2})(?: [0-9a-z]{2})* 78
正则表达式匹配以00 00 00
开头并以78
结尾的整个字符串,第一个捕获组匹配00 00 00
(您的目标)之后的第二个数字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.