"मैच नथिंग" के लिए नियमित अभिव्यक्ति सिंटैक्स?


83

मेरे पास एक पायथन टेम्प्लेट इंजन है जो रेगेक्सपी का भारी उपयोग करता है। यह संघनन का उपयोग करता है जैसे:

re.compile( regexp1 + "|" + regexp2 + "*|" + regexp3 + "+" )

मैं व्यक्तिगत सबस्ट्रिंग (regexp1, regexp2 आदि) को संशोधित कर सकता हूं।

क्या कोई छोटी और हल्की अभिव्यक्ति है जो कुछ भी मेल नहीं खाती है, जिसे मैं एक टेम्पलेट के अंदर उपयोग कर सकता हूं जहां मुझे कोई मैच नहीं चाहिए? दुर्भाग्य से, कभी-कभी '+' या '*' को regexp परमाणु से जोड़ा जाता है, इसलिए मैं एक खाली स्ट्रिंग का उपयोग नहीं कर सकता हूं - जो "दोहराए जाने के लिए कुछ भी नहीं" त्रुटि को बढ़ाएगा।



3
क्या शीर्षक को "कुछ भी मिलान करने में विफल रहने के लिए नियमित अभिव्यक्ति" के रूप में बेहतर शब्द कहा जा सकता है? कुछ भी नहीं मिलान एक खाली स्ट्रिंग के एक सफल मैच का तात्पर्य है।
बामापूकी

जवाबों:


126

यह कुछ भी मेल नहीं होना चाहिए:

re.compile('$^')

इसलिए यदि आप '$ ^' के साथ regexp1, regexp2 और regexp3 को प्रतिस्थापित करते हैं, तो मैच ढूंढना असंभव होगा। जब तक आप मल्टी लाइन मोड का उपयोग नहीं कर रहे हैं।


कुछ परीक्षणों के बाद मुझे एक बेहतर समाधान मिला

re.compile('a^')

मैच करना असंभव है और पिछले समाधान की तुलना में पहले विफल हो जाएगा। आप किसी भी अन्य चरित्र के साथ बदल सकते हैं और मैच करना हमेशा असंभव होगा


यह सुनिश्चित करने के लिए कुछ भी मेल नहीं खाएगा और regexp इंजन को संसाधित करने के लिए हल्का है? (मेरे स्टब regexps नहीं cpu का एक बहुत खाने के लिए चाहते हैं)
grigoryvp

@ नरक की। यह हल्का होना चाहिए। यह एक लाइन शुरू के बाद एक पंक्ति के अंत से मेल खाने की कोशिश करेगा। जो एक पंक्ति में असंभव है।
नादिया अल्रामली

1
लेकिन पाठ्यक्रम की कई पंक्तियों के साथ संभव है (यदि झंडा सक्षम है पर निर्भर करता है) - एक समाधान के लिए जो काम करता है कि झंडा सक्षम है या नहीं, अपना उत्तर देखें।
पीटर बॉटन

16
रेगेक्स "$ ^" खाली स्ट्रिंग से मेल खाता है, कम से कम कुछ कार्यान्वयन में। दूसरा बेहतर है।
रोमन स्टार्कोव

@romkyns दूसरा व्यक्ति PyQt4 पर मेरे कॉल में खाली स्ट्रिंग से मेल नहीं खाता है QtCore.QRegExp। इतना बुरा, क्योंकि यह निश्चित रूप से निष्पादित करने के लिए हल्का होता।
जोएल

43

(?!)हमेशा मैच में असफल होना चाहिए। यह शून्य-चौड़ाई वाला नकारात्मक रूप है। अगर कोष्ठक मैचों में क्या है तो पूरा मैच विफल हो जाता है। यह देखते हुए कि इसमें कुछ भी नहीं है, यह कुछ भी (कुछ भी नहीं सहित) के लिए मैच को विफल कर देगा।


4
ठीक है, मैं बस यह भी पोस्ट करने जा रहा था। यह सबसे अच्छा तरीका है, अगर आपकी भाषा लुकाहेड्स का समर्थन करती है। इसी तरह (? =) हर तार से मेल खाता है।
ब्रायन कार्टर

16

खाली स्ट्रिंग से मिलान करने के लिए - यहां तक ​​कि बहु-मोड में भी - आप उपयोग कर सकते हैं \A\Z, इसलिए:

re.compile('\A\Z|\A\Z*|\A\Z+')

अंतर यह है कि है \Aऔर \Zशुरू कर रहे हैं और के अंत स्ट्रिंग , जबकि ^और $इन शुरू / के अंत से मिलान कर सकते लाइनों , इसलिए $^|$^*|$^+संभवतः नई-पंक्तियों से युक्त (यदि ध्वज सक्षम किया गया है) एक स्ट्रिंग से मेल खा सकते।

और कुछ भी (यहां तक ​​कि एक रिक्त स्ट्रिंग) से मेल करने में विफल होने के लिए, बस स्ट्रिंग की शुरुआत से पहले सामग्री खोजने का प्रयास करें, जैसे:

re.compile('.\A|.\A*|.\A+')

चूँकि कोई भी वर्ण \ A (परिभाषा के अनुसार) से पहले नहीं आ सकता है, यह हमेशा मेल करने में विफल रहेगा।


तुम्हारा मेरा अच्छा लग रहा है क्योंकि मुझे लगता है कि यह लाइन के अंत का उपयोग करने की तुलना में तेजी से बाहर निकलेगा।
ShuggyCoUk

पीटर, आप \ z (लोअर-केस) का उपयोग करते हैं, जबकि मेरा पायथन पॉकेट गाइड मुझे एंड-ऑफ-स्ट्रिंग अभिकथन \ Z (अपर-केस) बताता है ?!
थॉमस

थॉमसएच, वे दोनों स्ट्रिंग के अंत हैं, लेकिन अपरकेस संस्करण एक अनुगामी न्यूलाइन की अनुमति देता है, जबकि लोअरकेस एक नहीं करता है।
पीटर बॉटन १।

Mh, दिलचस्प, मुझे लगता है यह कहीं भी प्रलेखित नहीं है। इसके अलावा, re.search ("boo \ z", "fooboo") एक मैच ऑब्जेक्ट नहीं देता है, जबकि re.search ("boo \ Z", "fooboo) करता है। बल्कि, re.search (" boo \ z " )"," फोबूज़ ") से मेल खाता है, जो इस तथ्य से बात करता है कि '\ z' की व्याख्या केवल 'z' के रूप में की जाती है, ठीक है। (यह Python 2.6 में है)।
ThomasH

क्षमा करें, मुझे लगा कि पायथन पीसीआरई था, लेकिन यह पता चला कि कुछ मतभेद हैं, और यह उनमें से एक है। ('एंकर' को नियमित रूप से देखें-expressions.info/refflavors.html )
पीटर


1

आप उपयोग कर सकते हैं
\z..
यह स्ट्रिंग का पूर्ण अंत है, इसके बाद कुछ भी हो सकता है

अगर +या *अंत में इससे निपटा जाता है, तब भी यह किसी भी चीज़ से मेल खाने से इनकार करता है


कुछ भी दो क्यों ? IIRC अनुगमन की \zअनुमति नहीं देता है, इसके विपरीत \Z, ताकि कोई पर्याप्त न हो? या यह एक अजीब बचाव के खिलाफ *(आप उस के खिलाफ क्यों रख रहे हैं?)
एमपीएन

0

या, बेकार regexp प्रविष्टियों को हटाने के लिए कुछ सूची समझ का उपयोग करें और उन सभी को एक साथ रखने के लिए शामिल हों। कुछ इस तरह:

re.compile('|'.join([x for x in [regexp1, regexp2, ...] if x != None]))

हालांकि कोड की उस पंक्ति के आगे कुछ टिप्पणियां जोड़ना सुनिश्चित करें :-)

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