2012-01-11 10 views
22

pydoc से:क्यों झंडा ignorecase नहीं करता है (re.I) re.sub में काम()

re.sub = उप (पैटर्न, repl, स्ट्रिंग, गिनती = 0, झंडे = 0)
प्रतिस्थापन प्रतिलिपि द्वारा स्ट्रिंग में पैटर्न के गैर-ओवरलैपिंग घटनाओं को बाएं को प्रतिस्थापित करके प्राप्त स्ट्रिंग को वापस करें। प्रतिलिपि या तो एक स्ट्रिंग या एक कॉल करने योग्य हो सकता है; यदि कोई स्ट्रिंग, बैकस्लैश इसमें से बच जाती है तो संसाधित होती है। यदि यह एक कॉल करने योग्य है, तो यह मिलान ऑब्जेक्ट पास कर चुका है और को प्रतिस्थापन स्ट्रिंग का उपयोग करने के लिए वापस लौटना होगा।

उदाहरण कोड:

import re 
print re.sub('class', 'function', 'Class object', re.I) 

जब तक कि मैं 'क्लास' के लिए पैटर्न बदलने के कोई प्रतिस्थापन किया जाता है।

दस्तावेज़ीकरण इस सीमा के बारे में कुछ भी नहीं बताता है, इसलिए मुझे लगता है कि मैं कुछ गलत कर रहा हूं।

यहां क्या मामला है?

उत्तर

43

मुझे लगता है कि तुम क्या कर किया जाना चाहिए:

import re 
print re.sub('class', 'function', 'Class object', flags=re.I) 
इस बिना

, re.I तर्क count तर्क को पारित कर दिया है।

+0

आह, तुम ठीक कह रहे हैं: _fun=re.sub

डेमो घोषणा समय re.sub उपयोग करने के लिए है)।। मुझे तर्क की आवश्यकता याद आई। मुख्य स्ट्रिंग में स्ट्रिंग ऑब्जेक्ट के बाद मुझे झंडे लगाने के लिए इस्तेमाल किया गया था। कार्य, इसलिए मैंने तर्क कॉल पर बहुत अधिक ध्यान नहीं दिया। धन्यवाद – theta

7

flags तर्क पांचवें एक है - आप count तर्क (बनाने के लिए एक आसान गलती) के रूप में re.I का मूल्य गुजर रहे हैं।

3

उन लोगों के लिए नोट करें जो अभी भी Python 2.6.x इंस्टॉल या पुराने से निपटते हैं। Python documentation for 2.6 re का कहना है:

re.sub(pattern, repl, string[, count]) 

re.compile(pattern[, flags]) 

इसका मतलब है आप उप करने के लिए सीधे झंडे पारित नहीं कर सकते हैं। उनका उपयोग केवल संकलन के साथ किया जा सकता है:

regex = re.compile('class', re.I) 
regex.sub("function", "Class object") 
0

बस सेप्पो के उत्तर में जोड़ने के लिए। http://docs.python.org/2.6/library/re.html के मुताबिक, 2.6 में सीधे 'सब' पर झंडे को पारित करने का एक तरीका अभी भी उपयोगी हो सकता है, यदि आपको 2.6 के साथ बहुत से सब के अनुकूल के साथ 2.7 कोड बनाना है तो उपयोगी हो सकता है। मैनुअल के शब्दों में:

... यदि आप नियमित अभिव्यक्ति झंडे निर्दिष्ट करने की आवश्यकता है, तो आप एक आरई वस्तु का उपयोग करें, या एक पैटर्न में एम्बेडेड संशोधक का उपयोग करना चाहिए; उदाहरण के लिए, उप ("(? i) बी +", "एक्स", "bbbb bbbb") रिटर्न 'xx'

और

(? iLmsux) (से एक या अधिक पत्र 'i', 'l', 'm', 's', 'u', 'x' सेट करें।) समूह खाली स्ट्रिंग से मेल खाता है; अक्षरों ने संबंधित झंडे सेट किए: re.I (मामले को अनदेखा करें), re.L (लोकेल आश्रित), re.M (बहु-पंक्ति), re.S (डॉट सभी से मेल खाता है), re.U (यूनिकोड आश्रित), और पूरी नियमित अभिव्यक्ति के लिए re.X (verbose)। (झंडे मॉड्यूल सामग्री में वर्णित हैं।) यह उपयोगी है अगर आप नियमित अभिव्यक्ति के हिस्से के रूप में झंडे को शामिल करना चाहते हैं, re.compile() फ़ंक्शन पर ध्वज तर्क पारित करने के बजाय।

अभ्यास में, इसका मतलब

print re.sub("class", "function", "Class object", flags= re.IGNORECASE)

इस तरह की गलतियों से बचने के लिए संशोधक (? एमएस) का उपयोग कर लिखा जा सकता है के रूप में

print re.sub("(?i)class", "function", "Class object")

1

, निम्नलिखित बंदर पैचिंग इस्तेमाल किया जा सकता है:

import re 
re.sub = lambda pattern, repl, string, *, count=0, flags=0, _fun=re.sub: \ 
    _fun(pattern, repl, string, count=count, flags=flags) 

(*count, flags को स्थितित्मक तर्क के रूप में निर्दिष्ट करने से मना करना है।

$ python 
Python 3.4.2 (default, Oct 8 2014, 10:45:20) 
[GCC 4.9.1] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import re 
>>> re.sub(r'\b or \b', ',', 'or x', re.X) 
'or x' # ?! 
>>> re.sub = lambda pattern, repl, string, *, count=0, flags=0, _fun=re.sub: \ 
...  _fun(pattern, repl, string, count=count, flags=flags) 
>>> re.sub(r'\b or \b', ',', 'or x', re.X) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: <lambda>() takes 3 positional arguments but 4 were given 
>>> re.sub(r'\b or \b', ',', 'or x', flags=re.X) 
', x' 
>>> 
संबंधित मुद्दे