2009-12-09 13 views
12

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} है "इसके भीतर?

+0

सीधे प्रश्न से संबंधित नहीं है, लेकिन आप अपने रेगेक्स में कच्चे तारों का उपयोग करके हमेशा अपने आप को बहुत दुःख बचाएंगे। –

+0

@ मार्क इसके लिए क्या कारण हैं? पारितोषिक के लिए धन्यवाद। – brildum

+4

एक नियम के रूप में, जब भी आप स्ट्रिंग अक्षर में बैकस्लैश डाल रहे हैं तो आपको कच्चे तारों का उपयोग करना चाहिए। अन्यथा आप अप्रत्याशित स्ट्रिंग से बच सकते हैं। यह Windows फ़ाइल पथों में सबसे स्पष्ट है जहां (गैर-कच्चे) "c: \ names \ bob" का अर्थ यह नहीं है कि इसका क्या अर्थ है। एक रेगेक्स में, कच्चे स्ट्रिंग का उपयोग करने का मतलब है कि आपकी रेगेक्स स्ट्रिंग वह है जो आप टाइप करते हैं। रेगेक्स में एक बैकस्लैश से मेल खाने के लिए, आपको इसे दूसरे से बचने की आवश्यकता है: \\ हालांकि गैर-कच्चे स्ट्रिंग में वह अनुक्रम एक बैकस्लैश उत्पन्न करता है लेकिन यह आपके रेगेक्स को देखने से स्पष्ट नहीं है। एक कच्ची स्ट्रिंग में, आपकी आर '\\' अपेक्षित के माध्यम से आता है। –

उत्तर

20

आपको पहले स्ट्रिंग को प्रारूपित करने और फिर रेगेक्स का उपयोग करने की आवश्यकता होगी। यह सब कुछ एक ही पंक्ति में रखने के लिए वास्तव में इसके लायक नहीं है। एस्केपिंग घुंघराले ब्रेसिज़ दोहरीकरण द्वारा किया जाता है:

>>> pat= '^(w{{3}}\.)?([0-9A-Za-z-]+\.){{1}}{domainName}$'.format(domainName = 'delivery.com') 
>>> pat 
'^(w{3}\\.)?([0-9A-Za-z-]+\\.){1}delivery.com$' 
>>> re.match(pat, str1) 

इसके अलावा, re.match स्ट्रिंग की शुरुआत में मिलान किया जाता है, अगर आप re.match उपयोग करते हैं, आप ^ जरूरत है अगर आप re.search का उपयोग कर रहे ^ डाल करने के लिए की जरूरत नहीं है , तथापि।

कृपया ध्यान दें, {1} रेगेक्स में बल्कि अनावश्यक है।

+4

न केवल '{1} 'अनावश्यक है, लेकिन' www '{w} {{}}' से स्पष्ट नहीं होगा।मुझे पता है कि यह मूल सामान्य प्रश्न का उत्तर नहीं देता है लेकिन इस मामले के लिए बेहतर समाधान की तरह लगता है। –

7
प्रति the documentation

, यदि आप एक शाब्दिक { या } की जरूरत है, स्वरूपण opertation जीवित रहने के मूल स्ट्रिंग में {{ और }} उपयोग करने के लिए।

'^(w{{3}}\.)?([0-9A-Za-z-]+\.){{1}}{domainName}$'.format(domainName = 'delivery.com') 
संबंधित मुद्दे