如何逐步解析数据Python?

How to parse data stepwise Python?

所以我一直在尝试解析一些不断进来的串口数据。我打算最终将我的程序实现到我的串口程序中,这样我就可以在那里解析数据了。现在我一直在努力尝试从一些文本中解析一个示例字符串,然后再尝试在数据不断到达时进行解析。下面的 'text' 字符串就是一个例子。我需要认识到 X 是子字符串的开头,而 space/EOL 是字符串的结尾。然后我需要拆分子字符串的 X 和 Y 部分,并将 X 中的值转换为整数。然后我需要将子字符串的 Y 部分中的字符分成对。

我现在的主要问题是我需要逐步执行此操作。因此需要识别子字符串的开始(X=)和结束(\n)标记,解析它以给出 X 的值和 Y 的成对列表。然后当第一个子字符串被处理后,我想要程序移动到下一个,并在没有剩余的相关子字符串时停止。

这个问题的解决方案或方法很容易找到,但我是 python/coding 的新手,所以这对我来说是一个很大的挑战。欢迎任何关于我可以学到什么来帮助我做到这一点的建议。

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']

您可以尝试使用正则表达式直接提取它们。这是我的尝试。

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']]

我会这样做:

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']}]