2010-11-07 16 views
5

मैं स्ट्रिंग designator: op1 op2 स्ट्रिंग से डिज़ाइनर और ऑप्स निकालना चाहता हूं, जिसमें 0 या अधिक ऑप्स और एकाधिक रिक्त स्थान की अनुमति हो सकती है। मैं अजगरपायथन नियमित अभिव्यक्ति

में निम्नलिखित नियमित अभिव्यक्ति का इस्तेमाल किया
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

ओपी के रेगेक्स के साथ क्या अंतर है? – SilentGhost

+0

खेद है कि मैंने पोस्ट को खत्म करने से पहले गोपनीय रूप से सबमिट किया था। – SingleNegationElimination

+0

आह, कोई परेशान नहीं। लेकिन यदि आप दो regexes के साथ जाते हैं, तो यह स्ट्रिंग विधियों का उपयोग करने के लिए और अधिक कुशल नहीं होगा? – SilentGhost

4

मैं वास्तव में नहीं दिख रहा है यही कारण है कि आप regex आवश्यकता होगी, यह स्ट्रिंग तरीकों के साथ पार्स करने के लिए काफी सरल है:

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

मैंने नहीं सोचा था कि विभाजन() का उपयोग एकाधिक रिक्त स्थान से अलग घटकों को विभाजित करने के लिए किया जा सकता है। मेरा मानना ​​है कि यह भी काम करता है। धन्यवाद! – Jeff

0

मैं इस तरह sth करना चाहते हैं:

>>> 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 
संबंधित मुद्दे