2010-11-07 40 views
5

Tôi muốn trích xuất trình chỉ định và các công cụ từ chuỗi designator: op1 op2, trong đó có thể có từ 0 op trở lên và nhiều khoảng trắng được cho phép. Tôi đã sử dụng cụm từ thông dụng sau đây trong PythonBiểu thức chính quy của Python

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

Vấn đề là chỉ des1 và op2 được tìm thấy trong nhóm phù hợp, op1 thì không. Có ai biết tại sao không?

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

Trả lời

4

cả hai đều được 'tìm thấy', nhưng chỉ một nhóm có thể được nhóm 'chụp'. nếu bạn cần chụp nhiều nhóm, thì bạn cần sử dụng chức năng biểu thức chính quy nhiều lần. Bạn có thể làm một cái gì đó như thế này, đầu tiên bằng cách viết lại biểu thức chính:

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

thì bạn cần phải trích xuất các phần riêng biệt:

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

sự khác biệt với regex của OP là gì? – SilentGhost

+0

xin lỗi tôi đã gửi một cách tình cờ trước khi hoàn thành bài đăng. – SingleNegationElimination

+0

ah, không bận tâm. nhưng nếu bạn đi với hai regexes, nó sẽ không hiệu quả hơn chỉ để sử dụng phương pháp chuỗi? – SilentGhost

4

tôi không thực sự hiểu tại sao bạn cần regex, nó khá đơn giản để phân tích với các phương pháp chuỗi:

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

Tôi không nghĩ rằng việc chia tách() có thể được sử dụng để phân tách các thành phần được phân tách bằng nhiều khoảng trắng. Tôi tin rằng điều này cũng hoạt động. Cảm ơn! – Jeff

0

tôi muốn làm sth như thế này:

>>> 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 
Các vấn đề liên quan