2010-11-07 60 views
5

我想從字符串designator: op1 op2中提取指示符和操作符,其中可能有0個或更多操作符,並且允許多個空格。我用以下正則表達式在PythonPython正則表達式

import re 
match = re.match(r"^(\w+):(\s+(\w+))*", "des1: op1 op2") 

存在的問題是,只有DES1與op2在匹配組被發現,OP1爲不。有誰知道爲什麼?

 
The groups from above code is 
Group 0: des1: op1 op2 
Group 1: des1 
Group 2: op2 
Group 3: op2 

回答

4

這兩者都是'找到'的,但只有一個可以被該組捕獲。如果您需要捕獲多個組,則需要多次使用正則表達式功能。你可以做這樣的事情,首先通過改寫主要表現:

match = re.match(r"^(\w+):(.*)", "des1: op1 op2") 

,那麼你需要提取個人小節:

ops = re.split(r"\s+", match.groups()[1])[1:] 
+0

OP的正則表達式有什麼區別? – SilentGhost 2010-11-07 20:53:22

+0

對不起,我在完成帖子之前偶然提交了。 – SingleNegationElimination 2010-11-07 20:54:49

+0

啊,不用麻煩了。但是如果你使用兩個正則表達式,使用字符串方法會不會更高效? – SilentGhost 2010-11-07 20:57:36

4

我真的不明白爲什麼你需要的正則表達式,這是很簡單的用字符串的方法來分析:

>>> des, _, ops = 'des1: op1 op2'.partition(':') 
>>> ops 
' op1 op2' 
>>> ops.split() 
['op1', 'op2'] 
+0

我沒有考慮split()可以用來拆分用多個空格分隔的組件。我相信這也是有效的。謝謝! – Jeff 2010-11-07 21:14:37

0

我做某事這樣的:

>>> import re 
>>> tokenize = re.compile(flags=re.VERBOSE, pattern=""" 
...  (?P<de> \w+ (?=:)) | 
...  (?P<op> \w+) 
... """).finditer 
... 
>>> 
>>> for each in tokenize("des1: op1 op2"): 
...  print each.lastgroup, ':', each.group() 
... 
de : des1 
op : op1 
op : op2