我已经遵循了正则表达式:
self.PosCheck = re.compile('[gG0-3]{1,3}|\s{1,2}[xX]-?([0-9.]{1,15})|\s[yY]-?([0-9.]{1,15})|\s[zZ]-?([0-9.]{1,15})')
它工作得很好并检测每个轴的每个值,如果它们可用,则将这些值分类到不同的组中。例如:position_response = "G0 X100 Y200 Z300"
regline = self.PosCheck.findall(position_response)
for i in regline:
if i[0]:
print (i[0]) #prints 100
if i[1]:
print (i[1]) #prints 200
if i[2]:
print (i[2]) #prints 300
但是如果有gG0-3则独立。如果没有gG0-3,RegEx不应该在组中提供任何答案。我该如何解决这个问题?
答案 0 :(得分:1)
我会使用命名组和单个匹配
import re
PosCheck = re.compile(
'(?i)^[gG0-3]{1,3}(?:\s+x-?(?P<x>[0-9.]{1,15})|\s+y-?(?P<y>[0-9.]{1,15})|\s+z-?(?P<z>[0-9.]{1,15}))*$')
for position_response in [
"G0 X100 Y200 Z300",
"G0 x100 z20",
"x150 y30",
]:
i = PosCheck.match(position_response)
if i:
print(position_response, '->', i.groupdict())
else:
print(position_response, '->', None)
输出:
G0 X100 Y200 Z300 -> {'x': '100', 'y': '200', 'z': '300'}
G0 x100 z20 -> {'x': '100', 'y': None, 'z': '20'}
x150 y30 -> None