繁体   English   中英

正则表达式匹配十六进制的一部分

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM