我正在嘗試使用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)。
我需要的是按原樣獲取資料(從\xa0end開始\xa0)以及一種區分資料的方法,以查看它是以 triple0xA0還是 single開頭0xA0。
當我將正則運算式構建為
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)
如何使用正則運算式獲取整個資料并檢查它是否以 Triple 或 single 開頭0xA0?
謝謝您的幫助,
uj5u.com熱心網友回復:
您可以使用額外的捕獲組再捕獲兩個\xa0,一旦匹配,檢查組。如果是None,這是型別 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
我假設您的匹配發生在字串的開頭。如果情況并非總是如此,您將需要^用否定的lookbehind替換:
b'(?<!\xa0)\xa0(\xa0\xa0)?(. ?)\xa0'
如果當前位置緊跟在后向模式之前(是軟/非中斷空間) ,則該(?<!\xa0)模式是一個否定的后向模式,匹配失敗。\xa0
uj5u.com熱心網友回復:
這是您的第一個正則運算式的修改:
- 使用貪婪匹配(
.)而不是非貪婪(. ?),并開始;和 - 尋找 1-3
\xa0(以較長者為準)來開始字串。
您的第一個正則運算式不起作用,因為非貪婪,捕獲\xa0和 next之間的最短字串\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)
uj5u.com熱心網友回復:
您的解決方案
matches = re.search(b'\xa0\xa0\xa0(. ?)\xa0', data2, re.IGNORECASE)
確實有效,但是,您已將其應用于data2而不是data1.
該正則運算式會像預期的那樣找到匹配的data1,但不是匹配的。data2您可以先使用此正則運算式。如果匹配,它將是“三重奏”。然后,您可以對剩余的位元組陣列應用更通用的正則運算式,如果它們匹配,它們將成為“單曲”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/411334.html
標籤:
下一篇:如何使用正則運算式僅獲取數字值
