2009-11-23 18 views
8

मैं एक नियमित अभिव्यक्ति को समझने की कोशिश कर रहा हूं जो किसी भी स्ट्रिंग से मेल खाता है जो एमपीईजी से शुरू नहीं होता है। इसका एक सामान्यीकरण किसी भी स्ट्रिंग से मेल खाता है जो किसी नियमित नियमित अभिव्यक्ति से शुरू नहीं होता है।एक नियमित नियमित अभिव्यक्ति को छोड़कर नियमित अभिव्यक्ति मिलान सब कुछ

[^m][^p][^e][^g].* 

इस के साथ समस्या यह है कि यह कम से कम 4 अक्षर की आवश्यकता है स्ट्रिंग में उपस्थित होने के लिए है:

मैं इस प्रकार की तरह कुछ करने की कोशिश की। मैं इसे संभालने का एक अच्छा तरीका समझने में सक्षम नहीं था और सामान्य उद्देश्य से इसे संभालने के लिए एक सामान्य तरीका।

मैं इसे पायथन में उपयोग करूँगा।

+2

आप एक regex सब कुछ आप नहीं चाहते चुनना होगा और सब कुछ आप चाहते हैं से मेल नहीं खाता है, तो , क्यों न सिर्फ 'नहीं' का उपयोग करें? –

+3

यह समुदाय विकी क्यों है? –

+0

ओह मुझे नहीं लगता कि मैं समुदाय विकी के उद्देश्य को समझता हूं। तो मैंने गलती से चेकबॉक्स का चयन किया। –

उत्तर

22
^(?!mpeg).* 

यह एक नकारात्मक अग्रदर्शी का उपयोग करता है केवल एक स्ट्रिंग जहां शुरुआत नहीं करता है 'से मेल खाते हैं टी mpeg मैच। अनिवार्य रूप से, यह आवश्यक है कि "स्ट्रिंग की शुरुआत में स्थिति एक ऐसी स्थिति न हो जहां हम रेगेक्स mpeg से मिलान करना शुरू कर दें, हम सफलतापूर्वक मिलान कर सकते हैं" - इस प्रकार एमपीईजी से शुरू नहीं होता है, और कुछ भी मेल नहीं खाता है ।

हालांकि, मैं संदर्भ में जो आप उपयोग कर रहे इस बारे में उत्सुक हो जाएगा - जैसे regex से अन्य विकल्प एक तरफ है जो या तो अधिक कुशल या अधिक पढ़े जा सकेंगे, हो सकता है ...

if not inputstring.startswith("mpeg"): 
+0

+1। –

+0

एक वेब इंटरफेस के माध्यम से उपयोगकर्ता द्वारा regex दर्ज किया जा रहा है। इसलिए मैं खुद को अजगर कार्यक्रम में रेगेक्स नहीं लिख रहा हूं। रेगेक्स एक घड़ी फ़ोल्डर के लिए एक फ़िल्टर सेटिंग की तरह है जिससे मेरा सॉफ़्टवेयर फाइल उठाता है। उपयोगकर्ता regex भरने के लिए उपयोगकर्ता इंटरफ़ेस का उपयोग करता है। मेरा पायथन कोड इस रेगेक्स को फ़िल्टरिंग मानदंड के रूप में लेता है और घड़ी फ़ोल्डर से उचित फ़ाइलों को उठाता है। Thanx उत्तर के बारे में बहुत कुछ। –

+0

या यहां तक ​​कि 'अगर इनपुटस्ट्रिंग नहीं है .startswith (' mpeg ') ' – Paul

2

प्रयास करें एक look-ahead assertion:

(?!mpeg)^.* 

या सिर्फ तुम नकार कक्षाएं उपयोग करना चाहते हैं:

^(.{0,3}$|[^m]|m([^p]|p([^e]|e([^g])))).*$ 
+0

आपकी "अस्वीकृत कक्षा" regex काम नहीं करेगा। अपने वाक्यविन्यास की जांच करें। –

+0

@ जे -16 एसडीआईजेड: आपको ऐसा क्यों लगता है? – Gumbo

+0

शायद क्योंकि वह सोचता है कि आप स्ट्रिंग की शुरुआत से पहले एमपीईजी "मैच नहीं" करने की कोशिश कर रहे हैं। भले ही यह पूरी तरह से कानूनी है^^ शून्य-चौड़ाई वाला एंकर है - वह सही है हालांकि यह भ्रमित लग रहा है। –

8

रेगेक्स के साथ अपना मन न खोएं।

if len(mystring) >=4 and mystring[:4]=="mpeg": 
    print "do something" 

या उपयोग startswith() के साथ "नहीं" कीवर्ड

if len(mystring)>=4 and not mystring.startswith("mpeg") 
+5

ध्यान दें कि आपको वास्तव में' लेन() 'चेक की आवश्यकता नहीं है - आप अपनी सीमाओं से परे तारों को टुकड़ा कर सकते हैं, तो आपको केवल कम वर्ण वापस मिलेंगे। – Amber

+0

हाँ, मुझे पता है कि। बस इतना है कि मैं ओपी की आवश्यकता को गलत तरीके से पढ़ता हूं। उन्होंने कहा "स्ट्रिंग में कम से कम 4 अक्षर मौजूद होने की आवश्यकता है"। कीवर्ड "स्ट्रिंग में" है। यह एक लंबी स्ट्रिंग हो सकती है और उसके पास वह आवश्यकता भी हो सकती है। वैसे भी, यह ओपी तक अब यह सही करने के लिए है। – ghostdog74

+0

मुझे लगता है कि बिट यह कह रहा था कि रेगेक्स में उसके मूल प्रयास को स्ट्रिंग में 4 वर्णों की आवश्यकता होती है, जब वह वास्तव में "एमपीईजी" से शुरू नहीं होने वाली किसी भी चीज़ से मेल खाना चाहता था, भले ही यह 4 वर्णों से कम हो। – Amber

0

आपका regexp मेल नहीं होता "npeg", मुझे लगता है कि आप ^($|[^m]|m($|[^p]|p($|[^e]|e($|[^g])))), जो काफी भयानक है के साथ आने की आवश्यकता होगी। एक और विकल्प ^(.{0,3}$|[^m]|.[^p]|..[^e]|...[^g]) होगा जो केवल थोड़ा बेहतर है।

तो मुझे लगता है तुम सच में एक नज़र आगे दावे का उपयोग करना चाहिए के रूप में Dav और Gumbo :-) ने सुझाव दिया

+0

आपका विकल्प एक विकल्प नहीं है क्योंकि यह सही नहीं है। यह * एनपीईजी * से मेल नहीं खाएगा। – Gumbo

+0

क्या आपने कोशिश की? re.match (आर "^ (। {0,3} $ | [^ एम] |। [^ पी] | .. [^ ई] | ... [^ जी])", "एनपीजी") एक रिटर्न देता है मैच ऑब्जेक्ट। यह काम करता है क्योंकि [^ एम] गुजरता है। –

संबंधित मुद्दे