如何逐步解析数据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']}]
所以我一直在尝试解析一些不断进来的串口数据。我打算最终将我的程序实现到我的串口程序中,这样我就可以在那里解析数据了。现在我一直在努力尝试从一些文本中解析一个示例字符串,然后再尝试在数据不断到达时进行解析。下面的 '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']}]