RegEx用于移动G-Code + Python

时间:2016-12-10 09:31:52

标签: python regex

我已经遵循了正则表达式:

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不应该在组中提供任何答案。我该如何解决这个问题?

1 个答案:

答案 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