2010-11-07 126 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