用于解析shell命令的正则表达式

时间:2016-02-26 09:20:36

标签: python regex

我正在尝试解析看起来像shell命令的字符串。这些命令的一般结构如下:

command value -arg1name arg1val -arg2name arg2val ... -argMname argMval

这是一个例子,

abc cmdh1521 -x 123 -y sadg -zzz 563sd

我正在使用Python re模块来解析,搜索和分组字符串,以便得到这样的输出,

(command, value, ((-arg1name, arg1val), (arg2name, arg2val), ... (argMname, argMval))

我尝试了以下命令集,但我的输出不是我想要的。

import re
cmd = "abc cmdh1521 -x 123 -y sadg -zzz 563sd"
_parser = r"^([a-z]+)\s{1}(\S*)((\s+\-[a-z]+\s{1}\S+)*)"
out = re.search(_parser, cmd)
print out.groups()

这是我得到的输出

('abc', 'cmdh1521', ' -x 123 -y sadg -zzz 563sd', ' -zzz 563sd')

我做错了什么?

我可以轻松实现非正则表达式解决方案,但我想知道是否有正则表达式可以给我一种我想要的解析?

2 个答案:

答案 0 :(得分:2)

然后再根据-

之前存在的空格进行拆分
>>> s = ('abc', 'cmdh1521', ' -x 123 -y sadg -zzz 563sd', ' -zzz 563sd')
>>> h = []
>>> for i in s:
    if '-' not in i:
        h.append(i)
    else:
        for j in re.split(r'\s+(?=-)', i):
            if j:
                h.append(j)


>>> h
['abc', 'cmdh1521', '-x 123', '-y sadg', '-zzz 563sd', '-zzz 563sd']
>>> 

>>> cmd = "abc cmdh1521 -x 123 -y sadg -zzz 563sd"
>>> import re
>>> re.findall(r'^(\S+)\s+(\S+)|(-\S+\s+\S+)', cmd)
[('abc', 'cmdh1521', ''), ('', '', '-x 123'), ('', '', '-y sadg'), ('', '', '-zzz 563sd')]
>>> [j for i in z for j in i if j ]
['abc', 'cmdh1521', '-x 123', '-y sadg', '-zzz 563sd']
>>> 

答案 1 :(得分:2)

在这种情况下,您将必须使用正向lookbehind正则表达式,如下所示:

(?<=-)(\w+) ([\w\d]+) 

描述和示例位于: Demo