所以我一直在嘗試決議一些不斷進入的串口資料。我打算最終將我的程式實作到我的串口程式中,這樣我就可以在那里決議資料。現在,我一直在嘗試從一些文本中決議示例字串,然后再嘗試將其作為資料不斷到達。下面的“文本”字串是一個示例。我需要認識到 X 是子字串的開頭,而空格/EOL 是字串的結尾。然后我需要拆分子字串的 X 和 Y 部分,并將 X 中的值轉換為整數。然后,我需要將子字串 Y 部分中的字符分成對。
我現在的主要問題是我需要逐步執行此操作。所以需要識別子字串的開始(X =)和結束(\ n)標記,決議它以給出X的值,以及Y的對串列。然后當第一個子字串被處理后,我想要程式進入下一個,并在沒有剩余相關子串時停止。
可能很容易找到解決方案或方法,但我是 python/編碼的新手,所以這對我來說是一個很大的挑戰。歡迎任何關于我可以學習什么來幫助我做到這一點的建議。
import re
#text is the data I want to parse
text = '00000:\nHHBBUUSSXXNJJDHCBSOXMJ X=-1323 Y=AA6D87CB78F8EE\nX=-908 Y=C87F32E6767\nX=-87 Y=AB67C78E23\n'
a = []
n = 2 #need to break up the Y values into pairs
S = re.findall(r'X=(.*)\n',text) #now a list with X & Y strings
for i in S:
a =i.split(' Y=') #Split X & Y string into 2 parts
ans = [a[i:i n] for i in range(0, len(a),n)]
def Extract(ans):
x = [int(item[0]) for item in ans] #convert X to integer
y = [re.findall('.{1,2}',item[1]) for item in ans] #split Y data
#into pairs
return x, y
print(Extract(ans))
>>>> Ex of what I want output to look like <<<<
Substring 1:
[X = -1323]
[Y = 'AA', '6D', '87', 'CB', '78', 'F8', 'EE'
(substring 1 is complete)
Substring 2:
[X = -908]
[Y = 'C8', '7F', '32', 'E6', '76', '7']
uj5u.com熱心網友回復:
這是我要做的:
input_string = r'00000:\nHHBBUUSSXXNJJDHCBSOXMJ X=-1323 Y=AA6D87CB78F8EE\nX=-908 Y=C87F32E6767\nX=-87 Y=AB67C78E23\n'
regex = r'(?:.*\s)?X=(?P<X>-?\d )\sY=(?P<Y>.*)'
parts = input_string.split(r'\n')
extracted_vals = []
for part in parts:
m = re.match(regex, part)
if m is None:
# No match, ignore
continue
# Extract X and Y
X,Y = m.groupdict().values()
extracted_vals.append(dict(X=int(X),
Y=[Y[i:i 2] for i in range(0,len(Y),2)]))
結果:
[{'X': -1323, 'Y': ['AA', '6D', '87', 'CB', '78', 'F8', 'EE']},
{'X': -908, 'Y': ['C8', '7F', '32', 'E6', '76', '7']},
{'X': -87, 'Y': ['AB', '67', 'C7', '8E', '23']}]
uj5u.com熱心網友回復:
您可以嘗試使用正則運算式直接提取它們。這是我的嘗試。
import re
text = '00000:\nHHBBUUSSXXNJJDHCBSOXMJ X=-1323 Y=AA6D87CB78F8EE\nX=-908 Y=C87F32E6767\nX=-87 Y=AB67C78E23\n'
regex = r'X=(-?\d ) Y=([A-Z0-9] )'
result = re.findall(regex, text) # [('-1323', 'AA6D87CB78F8EE'), ('-908', 'C87F32E6767'), ('-87', 'AB67C78E23')]
X = [int(i[0]) for i in result] # [-1323, -908, -87]
Y = [i[1] for i in result] # ['AA6D87CB78F8EE', 'C87F32E6767', 'AB67C78E23']
Y = [re.findall('..', i) for i in Y] # [['AA', '6D', '87', 'CB', '78', 'F8', 'EE'], ['C8', '7F', '32', 'E6', '76'], ['AB', '67', 'C7', '8E', '23']]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/446043.html
