2012-04-07 32 views
5

मैं इस पैटर्न लिखारेगेक्स पैटर्न जो कुछ एक्सटेंशन से मेल नहीं खाता है? इस पैटर्न file.name.jpg (2 डॉट्स)</p> <p>से मेल खाता है यह ठीक से काम करता filename.jpg पर (मेल नहीं खाता) -

^.*\.(?!jpg$|png$).+$ 

लेकिन वहाँ एक समस्या है। मैं यह पता लगाने की कोशिश कर रहा हूं कि इसे किसी भी .jpg फ़ाइलों से कैसे मेल नहीं किया जाए, भले ही फ़ाइल के नाम में 2 या अधिक बिंदु हों। मैं पीछे एक नज़र उपयोग करने की कोशिश लेकिन अजगर की शिकायत के बारे में एक निश्चित चौड़ाई का उपयोग नहीं (जो मैं वास्तव में लगता है कि क्या मतलब है नहीं कर रहा हूँ, लेकिन फ़ाइल नाम चर लंबाई हो जाएगा।)

उत्तर

10

यह काम करना चाहिए: ^.*\.(?!jpg$|png$)[^.]+$

+0

महान काम! उत्कृष्ट – yash

3

उपयोग os.path की गंधा कार्यों ठीक से विभाजित करने के लिए आसान पार्सिंग के लिए घटकों में filepath अप:

filepath, filename = os.path.split(str) 
basename, extension = os.path.splitext(filename) 

if exension[1:] in ['jpg', 'png']: 
    # The extension matches 

इस regex (यह मत करो यह तुम क्या करना चाहते हैं की सटीक विपरीत है।) का प्रयास करें:

\.(jpg|png)([^\.]|$) 
+0

मेरे पास पाइथन तक पहुंच नहीं है, यह पाइथन का रेगेक्स इंजन है, लेकिन मेरे पास केवल एक JSON कॉन्फ़िगरेशन फ़ाइल तक पहुंच है ताकि रीजन को पायथन प्रोग्राम के लिए रखा जा सके। मैंने भ्रम को रोकने के लिए पायथन टैग हटा दिया। –

+0

मेरा संपादन देखें। मुझे लगता है कि इसे – Blender

+0

काम करना चाहिए, आपका रेगेक्स ऐसा लगता है कि * * .jpg.' या '.png.' युक्त स्ट्रिंग को बाहर करने की कोशिश कर रहा है, लेकिन मेरा मानना ​​है कि विचार '.jpg' के साथ * समाप्त होता है * '.png'। ओपी का रेगेक्स विफल हो रहा है क्योंकि 'look.head.jpg' में पहले '.' के बाद लुकहेड और अंतिम' + $' दोनों मिलान कर सकते हैं। इसे '[^।] + $ 'में बदलकर, @bereal ने किया, लुकहेड को केवल अंतिम बिंदु पर लागू करने के लिए मजबूर करता है-जो भी अनुक्रम। –

0

कृपया

 
    .*\.(jpg$|png$) 

कोशिश यह सही ढंग से filename.jpg पर मेल खाएगी। किसी भी .jpg फ़ाइलों से मेल खाने के तरीके को जानने का प्रयास करने का प्रयास करने के बावजूद फ़ाइल के नाम में 2 या अधिक बिंदु हैं, ठीक काम करेंगे।
पायथन स्क्रिप्ट का उपयोग करते समय सुनिश्चित करें कि आप सही प्रकार के विभाजन का उपयोग कर रहे हैं। विभिन्न प्रकार के विभाजन जैसे rsplit (दाएं विभाजन) और lsplit (बाएं विभाजन)।

+0

आपको इसे पिछड़ा मिला है: regex को 'filename.jpg' या 'file.name.png' से मेल नहीं खाना चाहिए। 'filename.txt' या 'file.name.foo' ठीक है, मुझे लगता है। –

1

ऐसा लगता है कि लगभग यह था:

.*\.(?!jpg$|png$)[^.]+ 

मेरी परीक्षण के अनुसार (जावा में) मैं ये परिणाम प्राप्त:

file.jpg - false 
file.png - false 
file.name.jpg - false 
file.name.png - false 
file.gif - true 
file.name.gif - true 
file.jpg.gif - true 
file.jpge - true 

यदि यह नहीं है कि तुम क्या दलीलों के साथ अपने प्रश्न अपडेट करना चाहता था आपकी उम्मीदें।

^.+$(?<!\.jpg)(?<!\.png) 

^.+ सख्ती से आवश्यक नहीं है, लेकिन कैसे JSON पार्सर आप कोडित है पर निर्भर करता है:

1

आप केवल परवाह है कि स्ट्रिंग .jpg या .png साथ अंत नहीं है, तो आप इस का उपयोग कर सकते पूरे स्ट्रिंग का उपभोग करने के लिए रेगेक्स को मजबूर करने की आवश्यकता हो सकती है।

^\w+(?:\.\w+)+$(?<!\.jpg)(?<!\.png) 

आप शायद (?<!\.jpg|\.png) उपयोग करने के लिए है, जो क्योंकि पायथन के regex स्वाद सबसे में से एक है काम नहीं होगा की कोशिश की: आपको अन्य सत्यापन के लिए regex का उपयोग कर रहे हैं, तो आप और अधिक व्यापक कुछ, जैसे चाहते हो सकता है जब यह देखने की बात आती है तो प्रतिबंधक। PHP और रूबी 1.9+ इसे स्वीकार करेंगे क्योंकि प्रत्येक विकल्प में निश्चित लंबाई होती है। उन्हें भी लंबाई होने की आवश्यकता नहीं है; (?<!\.jpg|\.jpeg|\.png) भी काम करेगा। बस (?<!\.(?:jpg|jpeg|png)) में डॉट को कारक करने की कोशिश न करें; विकल्प दिखने के शीर्ष स्तर पर होना चाहिए।

जावा फैक्टर-आउट संस्करण को स्वीकार करेगा क्योंकि यह संकलन समय पर थोड़ा अधिक काम करता है ताकि अधिकतम अक्षरों को निर्धारित करने की आवश्यकता हो। हालांकि, अभिव्यक्ति अभिव्यक्ति को काफी सरल होना आवश्यक है, और यह + या * क्वांटिफ़ायर का उपयोग नहीं कर सकता है। अंत में, .NET और JGSoft स्वादों पर सभी पर कोई प्रतिबंध नहीं है। लेकिन पाइथन एक सटीक दिमागी प्रयास बनाता है जो देखने के लिए आवश्यक पात्रों की सटीक संख्या को समझने के लिए बनाता है, जो उस क्रिप्टिक त्रुटि संदेश को विफल होने पर उत्पन्न करता है।

+0

धन्यवाद, महान जवाब। –

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