str.format()
का उपयोग अजगर 2.6, और अजगर 3. में स्वरूपण तार मैं जब नियमित अभिव्यक्ति के साथ str.format()
का उपयोग कर एक मुद्दा आई है के लिए नए मानक है।अजगर 2.6+ str.format() और नियमित अभिव्यक्ति
मैं रेगुलर एक्सप्रेशन लिखा है सभी डोमेन है कि एक निर्दिष्ट डोमेन नीचे एक एकल स्तर हैं या किसी भी डोमेन जो डोमेन के नीचे 2 स्तर निर्दिष्ट कर रहे हैं, यदि 2 स्तर से नीचे www है वापस जाने के लिए ...
निर्दिष्ट डोमेन मानते हैं delivery.com है, मेरे regex को a.delivery.com, b.delivery.com, www.c.delivery.com वापस करना चाहिए ... लेकिन इसे xadelivery.com वापस नहीं करना चाहिए।
import re
str1 = "www.pizza.delivery.com"
str2 = "w.pizza.delivery.com"
str3 = "pizza.delivery.com"
if (re.match('^(w{3}\.)?([0-9A-Za-z-]+\.){1}delivery.com$', str1): print 'String 1 matches!'
if (re.match('^(w{3}\.)?([0-9A-Za-z-]+\.){1}delivery.com$', str2): print 'String 2 matches!'
if (re.match('^(w{3}\.)?([0-9A-Za-z-]+\.){1}delivery.com$', str3): print 'String 3 matches!'
इस रनिंग परिणाम देना चाहिए:
String 1 matches!
String 3 matches!
अब, समस्या यह है कि जब मैं गतिशील str.format का उपयोग कर delivery.com को बदलने के लिए प्रयास करें ...
if (re.match('^(w{3}\.)?([0-9A-Za-z-]+\.){1}{domainName}$'.format(domainName = 'delivery.com'), str1): print 'String 1 matches!'
यह असफल प्रतीत होता है, क्योंकि str.format()
फ़ंक्शन के पैरामीटर होने के लिए {3}
और {1}
की अपेक्षा करता है। (मैं यह सोचते हैं रहा हूँ)
मैं का उपयोग कर + ऑपरेटर
'^(w{3}\.)?([0-9A-Za-z-]+\.){1}' + domainName + '$'
प्रश्न के नीचे आता है स्ट्रिंग जोड़ सकता है, यह संभव str.format()
उपयोग करने के लिए जब स्ट्रिंग (आमतौर पर regex) "है {n} है "इसके भीतर?
सीधे प्रश्न से संबंधित नहीं है, लेकिन आप अपने रेगेक्स में कच्चे तारों का उपयोग करके हमेशा अपने आप को बहुत दुःख बचाएंगे। –
@ मार्क इसके लिए क्या कारण हैं? पारितोषिक के लिए धन्यवाद। – brildum
एक नियम के रूप में, जब भी आप स्ट्रिंग अक्षर में बैकस्लैश डाल रहे हैं तो आपको कच्चे तारों का उपयोग करना चाहिए। अन्यथा आप अप्रत्याशित स्ट्रिंग से बच सकते हैं। यह Windows फ़ाइल पथों में सबसे स्पष्ट है जहां (गैर-कच्चे) "c: \ names \ bob" का अर्थ यह नहीं है कि इसका क्या अर्थ है। एक रेगेक्स में, कच्चे स्ट्रिंग का उपयोग करने का मतलब है कि आपकी रेगेक्स स्ट्रिंग वह है जो आप टाइप करते हैं। रेगेक्स में एक बैकस्लैश से मेल खाने के लिए, आपको इसे दूसरे से बचने की आवश्यकता है: \\ हालांकि गैर-कच्चे स्ट्रिंग में वह अनुक्रम एक बैकस्लैश उत्पन्न करता है लेकिन यह आपके रेगेक्स को देखने से स्पष्ट नहीं है। एक कच्ची स्ट्रिंग में, आपकी आर '\\' अपेक्षित के माध्यम से आता है। –