2008-10-08 13 views
16

तारों से मेल खाने के लिए नियमित अभिव्यक्ति क्या है (इस मामले में, फ़ाइल नाम) जो 'रन' से शुरू होती है और '.py' का फ़ाइल नाम एक्सटेंशन है?फ़ाइल नाम और फ़ाइल नाम एक्सटेंशन की शुरूआत के लिए नियमित अभिव्यक्ति

नियमित अभिव्यक्ति निम्न में से किसी से मेल खाना चाहिए:

RunFoo.py 
RunBar.py 
Run42.py 

यह मेल नहीं करना चाहिए:

myRunFoo.py 
RunBar.py1 
Run42.txt 

मैं के लिए क्या देख रहा हूँ की एसक्यूएल बराबर ... LIKE 'Run%.py' ... है। विशेष रूप से अजगर में

/^Run[\w]*?\.py$/ 

उत्तर

32

कोशिश एक रेगुलर एक्सप्रेशन के लिए, आप का प्रयोग करेंगे:

re.match(r'Run.*\.py$') 

एक त्वरित स्पष्टीकरण:

  • । मतलब किसी भी चरित्र से मेल खाता है।
  • * पिछले वर्ण के किसी भी पुनरावृत्ति से मेल खाते हैं इसका मतलब है (इसलिए। * वर्ण के किसी भी क्रम का मतलब है)
  • \ स्पष्ट डॉट
  • से बचने के लिए भागने $ "स्ट्रिंग के अंत" इंगित करता है, इसलिए हम डॉन ' टी मैच "Run_foo.py.txt"

हालांकि, इस कार्य के लिए, आप शायद सरल स्ट्रिंग विधियों का उपयोग करके बेहतर हो सकते हैं। अर्थात।

filename.startswith("Run") and filename.endswith(".py") 

नोट: यदि आप मामले असंवेदनशीलता (चाहते हैं यानी मिलान "run.PY" के साथ ही "Run.py", रेगुलर एक्सप्रेशन में re.I विकल्प का उपयोग, या किसी विशिष्ट मामले में कन्वर्ट (। जैसे filename.lower()) स्ट्रिंग तरीकों का उपयोग कर से पहले

+2

1. आपको पायथन नियमित अभिव्यक्ति मिलान के लिए लाइन की शुरुआत निर्दिष्ट करने की आवश्यकता नहीं है? 2. * शून्य या अधिक मिलान है (यानी रन.py स्वीकार्य होगा) –

+0

इसके अलावा, आप इसे केस-असंवेदनशील कैसे बनायेंगे? –

+0

re.match पहले ही स्ट्रिंग की शुरुआत निर्दिष्ट करता है (जैसा कि re.search के विपरीत है, जो नहीं करता है)। परिभाषा को देखते हुए "रन.py" * मिलान करना चाहिए (यह रन के साथ शुरू होता है, और इसमें एक .py एक्सटेंशन है)। असंवेदनशीलता के मामले में, अंत में नोट देखें। – Brian

0

यह शायद पूरी तरह से फ़ाइल नामकरण मानकों का अनुपालन नहीं करता है, लेकिन यहाँ यह जाता है

import re 
re.match(r"^Run.*\.py$", stringtocheck) 

इस से मेल खाएगी "Runfoobar .py ", लेकिन" runfoobar.PY "नहीं। यह असंवेदनशील मामला बनाने के लिए, के बजाय का उपयोग करें:

re.match(r"^Run.*\.py$", stringtocheck, re.I) 
+0

एक सवाल में चिह्नित अजगर के लिए एक पर्ल समाधान की तरह दिखता है ... लेकिन मैं एक अजगर विशेषज्ञ नहीं हूँ: p और जॉब्स्री ने बताया कि आपका समाधान केस-संवेदी है। –

+0

* गलती से रॉब हॉवर्ड ने इंगित किया है कि –

+0

है जिसका उपयोग आप नहीं करना चाहिए। *, \ W - विराम चिह्न और सफेद जगह आदि के बजाय शायद अभी भी फ़ाइल नाम का हिस्सा माना जाना चाहिए। उदाहरण के लिए "Run.foo.py" – Brian

0

mabye:

^Run.*\.py$ 

बस एक त्वरित

+0

आपको इसके बजाय * * चाहिए। (जो केवल एक ही चरित्र से मेल खाता है) – Brian

+0

दोह, धन्यवाद ब्रायन – imjoevasquez

14

चेतावनी:।

  • jobscry के जवाब ("।?।^भागो py $") गलत है (से मेल नहीं खाएगी "Run123.py", के लिए उदाहरण)
  • ऑरलैंडु 63 का उत्तर ("/^Run[\w]*?.py$/") "RunFoo.Bar.py" से मेल नहीं खाएगा।

(मेरे पास टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है, क्षमा करें।"रन" के बीच बिट निकालने और ".py":)

+0

हम आपको उन प्रतिनिधि अंक प्राप्त करेंगे :) –

+1

क्रिप्स, जो जल्दी था। धन्यवाद। :-) –

2

आप एक से थोड़ा अधिक जटिल नियमित अभिव्यक्ति लिखने हैं, तो आप एक अतिरिक्त सुविधा प्राप्त कर सकते हैं

>>> import re 
>>> regex = '^Run(?P<name>.*)\.py$' 
>>> m = re.match(regex, 'RunFoo.py') 
>>> m.group('name') 
'Foo' 

(अतिरिक्त बिट कोष्ठकों है और '। *' को छोड़कर, उनके बीच सबकुछ, जो रॉब हॉवर्ड के जवाब में है)

12

मुझे वास्तव में समझ में नहीं आता कि आप इस समस्या को हल करने के लिए नियमित अभिव्यक्ति के बाद क्यों हैं। आप 'रन' से शुरू होने वाली सभी .py फ़ाइलों को ढूंढने के लिए बस एक तरीके से हैं।

import os 
for filename in os.listdir(dirname): 
    root, ext = os.path.splitext(filename) 
    if root.startswith('Run') and ext == '.py': 
     print filename 
4

तुम एक नियमित अभिव्यक्ति की जरूरत नहीं है, आप ग्लोब, जो वाइल्डकार्ड जैसे लेता उपयोग कर सकते हैं: तो यह एक सरल उपाय है कि काम करेंगे, एक चल रहा है एक नियमित अभिव्यक्ति संकलन का सहारा के बिना है भागो * .py

उदाहरण के लिए, अपने वर्तमान निर्देशिका में उन फ़ाइलों को प्राप्त करने के लिए ...

import os, glob 
files = glob.glob("".join([ os.getcwd(), "\\Run*.py"])) 
संबंधित मुद्दे