2016-02-26 56 views
3

我想解析看起來像shell命令的字符串。這些命令的一般結構如下:正則表達式用於解析像字符串的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

之前,如下圖所示-

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

我能得到的那種解析我想要的,而不必求助於手動分割這些個別字符串喜歡你做了什麼? – siva82kb

+0

檢查我的更新....... –

2

在這種情況下,你將不得不使用正回顧後發正則表達式然後再根據空間存在分裂:

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

描述和示例在: Demo