我正在尝试用bytearray
构建一个正则表达式。我有两种字节数组
data1 = b'\xa0\xa0\xa0\x81\x01\x04\x07\x00\x00\x0f2\x8e\xa0\xa0'
data2 = b'\xa0\x81\x01\x04\x07\x00\x00\x0f2\x8e\xa0\xa0'
data1
和data2
的区别是\xa0\xa0\xa0
(data1
有三重0xA0
)和\xa0
(data2
有单0xA0
)。
我需要的是按原样获取数据(从\xa0
开始到\xa0
末尾),以及一种区分数据的方法,以查看数据是以三重0xA0
还是以单个0xA0
开头。
当我将regex构建为
matches = re.search(b'\xa0(.+?)\xa0', data2, re.IGNORECASE)
它适用于data2。但我不知道是单一数据还是三重数据。而且它不适用于data1 (返回为\xa0\xa0\xa0
)
不起作用的是:
matches = re.search(b'\xa0\xa0\xa0(.+?)\xa0', data2, re.IGNORECASE)
matches = re.search(b'\xa0((\xa0\xa0))?(.+?)\xa0', data1, re.IGNORECASE)
如何使用正则表达式获取整个数据,并检查它是以三重还是单个0xA0
开头
谢谢你的帮助,
发布于 2022-01-15 12:11:37
您可以使用一个额外的捕获组来再捕获两个\xa0
,一旦有匹配,就检查组。如果没有,这是类型2,否则,它是类型1:
b'^\xa0(\xa0\xa0)?(.+?)\xa0'
在Python中:
import re
rx = b'^\xa0(\xa0\xa0)?(.+?)\xa0'
m = re.search(rx, data1, re.IGNORECASE)
if m:
if m.group(1):
print("This is data of Type 1")
else:
print("This is data of Type 2")
# => This is data of Type 1
我猜你的比赛发生在字符串的开头。如果情况并非总是如此,则需要将^
替换为负查找:
b'(?<!\xa0)\xa0(\xa0\xa0)?(.+?)\xa0'
如果当前位置紧接在查找模式前面( (?<!\xa0)
是一个软/非中断空间),则\xa0
模式是一个负查找模式,导致匹配失败。
发布于 2022-01-15 12:03:03
下面是对您的第一个正则表达式的修改:
.+
)代替非贪婪(.+?
)并开始;\xa0
(以较长的为准)来启动字符串。您的第一个正则表达式无法工作,因为由于不贪婪,可以捕获\xa0
与下一个\xa0
之间最短的字符串,即\xa0\xa0\xa0
。在您可以使用startswith
查看它是哪种数据之后:
# get contents
matches = re.search(b'\xa0{1,3}(.+)\xa0', data`, re.IGNORECASE)
# check type
is_like_data1 = data1.startswith(b'\xa0'*3)
发布于 2022-01-15 12:00:02
你的解决方案
matches = re.search(b'\xa0\xa0\xa0(.+?)\xa0', data2, re.IGNORECASE)
但是,您已经在data2
而不是data1
上应用了它。
该正则表达式将为data1
找到匹配项,但不会像预期的那样为data2
找到匹配项。您可以先使用这个正则表达式。如果匹配的话,那就是“三重”。然后,您可以对剩下的字节数组应用更通用的正则表达式,如果它们匹配,它们将是“单身”。
https://stackoverflow.com/questions/70724926
复制相似问题