अजगर गैर-लालची सजीले टुकड़े


150

मैं "(.*)"इस तरह से अजगर रेगेक्स कैसे बनाऊं , इसके बजाय "a (b) c (d) e"अजगर मैचों को दिया "b"जाता है "b) c (d"?

मुझे पता है कि मैं "[^)]"इसके बजाय उपयोग कर सकता हूं ".", लेकिन मैं एक अधिक सामान्य समाधान की तलाश कर रहा हूं जो मेरे रेगेक्स को थोड़ा साफ रखता है। क्या अजगर को यह बताने का कोई तरीका है कि "अरे, जितनी जल्दी हो सके, यह मिलान करें"?

जवाबों:


209

तुम सर्व-शक्तिशाली की तलाश करो *?

डॉक्स से, लालची बनाम गैर-लालची

गैर लालची क्वालिफायर *?, +?, ??, या {m,n}?[...] के रूप में मैच थोड़ा संभव के रूप में पाठ।


इंटरनेट आर्काइव के अनुसार, उस सभी लिंक को पायथन "पुनः" मॉड्यूल डॉक्स की एक प्रति बताया गया था, इसलिए ट्रे का लिंक भी काम करता है।
स्पिफाइटेक

2
इसके लिए सामान्य अंग्रेजी नाम क्या है *??
ट्रेवर बोयड स्मिथ

वाइल्डकार्ड के पात्र @ ट्रेवर बॉयड स्मिथ
सर्ज

3
इसे "गैर लालची" क्वालिफायर कहा जाता है
ब्रुनेटन

65
>>> x = "a (b) c (d) e"
>>> re.search(r"\(.*\)", x).group()
'(b) c (d)'
>>> re.search(r"\(.*?\)", x).group()
'(b)'

डॉक्स के अनुसार :

' *', ' +', और ' ?' क्वालिफायर ' ' सभी लालची होते हैं; वे जितना संभव हो उतना पाठ से मेल खाते हैं। कभी-कभी यह व्यवहार वांछित नहीं होता है; अगर RE <.*>का मिलान ' <H1>title</H1>' के विरुद्ध किया जाता है , तो यह पूरे स्ट्रिंग से मेल खाएगा, न कि सिर्फ ' <H1>'। ?क्वालीफायर के बाद ' ' जोड़ने से यह मैच गैर-लालची या न्यूनतम फैशन में हो जाता है; जितना संभव हो कम पात्रों का मिलान किया जाएगा। .*?पिछली अभिव्यक्ति में उपयोग केवल ' <H1>' से मेल खाएगा ।


14

\\(.*?\\)काम नहीं करेगा ? वह गैर-लालची वाक्य-विन्यास है।


5

जैसा कि दूसरों ने कहा है? * मात्रा पर संशोधक आपकी तात्कालिक समस्या को हल करेगा, लेकिन सावधान रहें, आप उन क्षेत्रों में भटकना शुरू कर रहे हैं जहां रेग्जेस काम करना बंद कर देते हैं और आपको इसके बजाय एक पार्सर की आवश्यकता होती है। उदाहरण के लिए, स्ट्रिंग "(फू (बार)) बाज" आपको परेशान करेगा।


5

एक अस्पष्ट मैच का उपयोग करना एक अच्छी शुरुआत है, लेकिन मैं यह भी सुझाव दूंगा कि आप किसी भी उपयोग पर पुनर्विचार करें .*- इस बारे में क्या?

groups = re.search(r"\([^)]*\)", x)

3

क्या आप इसे "(बी)" से मैच करना चाहते हैं? जैसा कि Zitrax और पाओलो ने सुझाया है। क्या आप इसे "बी" से मैच करना चाहते हैं? करना

>>> x = "a (b) c (d) e"
>>> re.search(r"\((.*?)\)", x).group(1)
'b'

0

इसके साथ शुरू करने के लिए, मैं regexes में "*" का उपयोग करने का सुझाव नहीं देता। हाँ, मुझे पता है, यह सबसे अधिक इस्तेमाल किया जाने वाला मल्टी-कैरेक्टर सीमांकक है, लेकिन फिर भी यह एक बुरा विचार है। ऐसा इसलिए है, क्योंकि यह उस चरित्र के लिए किसी भी पुनरावृत्ति से मेल खाता है, "किसी भी" में 0 शामिल है, जो आमतौर पर ऐसा कुछ है जिसके लिए आप एक वाक्यविन्यास त्रुटि फेंकना चाहते हैं, स्वीकार नहीं करते हैं। इसके बजाय, मैं संकेत का उपयोग करने का सुझाव देता हूं +, जो कि लंबाई के किसी भी पुनरावृत्ति से मेल खाता है। 1. मैं क्या देख सकता हूं, इससे अधिक, आप निश्चित-लंबाई वाले कोष्ठक अभिव्यक्तियों के साथ काम कर रहे हैं। परिणामस्वरूप, आप {x, y}विशेष रूप से वांछित लंबाई निर्दिष्ट करने के लिए सिंटैक्स का उपयोग कर सकते हैं।

हालांकि, अगर आपको वास्तव में गैर-लालची पुनरावृत्ति की आवश्यकता है, तो मेरा सुझाव है कि सभी शक्तिशाली से परामर्श करें ?। यह, जब किसी भी रेगेक्स पुनरावृत्ति विनिर्देशक के अंत के बाद रखा जाता है, तो रेगेक्स के उस हिस्से को कम से कम पाठ को खोजने के लिए बाध्य करेगा।

यह कहा जा रहा है, मैं इसके साथ बहुत सावधान ?रहूंगा, जैसे कि डॉ। कौन में सोनिक स्क्रूड्राइवर, करने की प्रवृत्ति है, मुझे इसे कैसे लगाना चाहिए, "थोड़ा" अवांछित चीजों को अगर सावधानी से कैलिब्रेट नहीं किया गया है। उदाहरण के लिए, अपने उदाहरण इनपुट का उपयोग करने के लिए, यह ((1)एक मैच के रूप में (दूसरे रैपर की कमी को नोट करेगा) पहचान करेगा ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.