2009-05-28 26 views

उत्तर

148

string प्रकार इसका समर्थन नहीं करता है। re.IGNORECASE विकल्प के साथ आप शायद the regular expression sub method का उपयोग कर सबसे अच्छे हैं।

>>> import re 
>>> insensitive_hippo = re.compile(re.escape('hippo'), re.IGNORECASE) 
>>> insensitive_hippo.sub('giraffe', 'I want a hIPpo for my birthday') 
'I want a giraffe for my birthday' 
+7

यदि आप केवल एक ही प्रतिस्थापन कर रहे हैं, या कोड की लाइनों को सहेजना चाहते हैं, तो re.sub और (? I) ध्वज के साथ एक प्रतिस्थापन का उपयोग करना अधिक कुशल है: re.sub ('(? I) 'फिर सेभागो ('हिप्पो'), 'जिराफ', 'मैं अपने जन्मदिन के लिए एक एचआईपीपीओ चाहता हूं') –

+8

+1 re.escape – daboross

+2

के लिए +1 क्यों ** अक्षरों की स्ट्रिंग के लिए ** re.escape **? धन्यवाद। – Elena

61
import re 
pattern = re.compile("hello", re.IGNORECASE) 
pattern.sub("bye", "hello HeLLo HELLO") 
# 'bye bye bye' 
2

यह आवश्यकता नहीं है RegularExp

def ireplace(old, new, text): 
    """ 
    Replace case insensitive 
    Raises ValueError if string not found 
    """ 
    index_l = text.lower().index(old.lower()) 
    return text[:index_l] + new + text[index_l + len(old):] 
+2

अच्छा, हालांकि यह पुरानी सभी घटनाओं को नए से नहीं बदलता है, लेकिन केवल पहली घटना है। – rsmoorthy

+3

यह regex संस्करण से कम पठनीय है। यहां पहिया को फिर से शुरू करने की जरूरत नहीं है। –

+0

इस और ऊपर के संस्करणों के बीच प्रदर्शन तुलना करना दिलचस्प होगा, यह तेज़ हो सकता है, जो कुछ अनुप्रयोगों के लिए महत्वपूर्ण है। या यह धीमा हो सकता है क्योंकि यह व्याख्यान पायथन में अधिक काम करता है। –

5

bFloch के जवाब पर जारी रखते हुए, इस समारोह नहीं एक बदल जाएगा, लेकिन नए के साथ पुराने की सभी घटनाओं - एक केस संवेदी फैशन में।

def ireplace(old, new, text): 
    idx = 0 
    while idx < len(text): 
     index_l = text.lower().find(old.lower(), idx) 
     if index_l == -1: 
      return text 
     text = text[:index_l] + new + text[index_l + len(old):] 
     idx = index_l + len(new) 
    return text 
+0

बहुत अच्छी तरह से किया। रेगेक्स से काफी बेहतर; यह सभी प्रकार के पात्रों को संभालता है, जबकि रेगेक्स गैर-अल्फान्यूमेरिक के बारे में बहुत उग्र है। पसंदीदा उत्तर IMHO। – fyngyrz

+0

आपको बस इतना करना है कि रेगेक्स से बचें: स्वीकृत उत्तर इस से पढ़ने के लिए बहुत छोटा और आसान है। –

-1

से पहले एक जवाब कभी नहीं पोस्ट और इस सूत्र वास्तव में पुराना है, लेकिन मैं एक और sollution के साथ आया था और लगा मैं अपने प्रतिसाद देने मिल सकता है, मैं अजगर प्रोग्रामिंग में अनुभवी नहीं है, इसलिए यदि वहाँ यह करने के लिए appearant कमियां हैं, कृपया बात उन्हें बाहर अपनी अच्छी सीखने :)

i='I want a hIPpo for my birthday' 
key='hippo' 
swp='giraffe' 

o=(i.lower().split(key)) 
c=0 
p=0 
for w in o: 
    o[c]=i[p:p+len(w)] 
    p=p+len(key+w) 
    c+=1 
print(swp.join(o)) 
+2

सीखने के लिए: आम तौर पर जब आप एक स्ट्रिंग पर खोज करते हैं और प्रतिस्थापित करते हैं, तो बेहतर है कि इसे पहले किसी सरणी में बदलना न पड़े। यही कारण है कि पहला जवाब शायद सबसे अच्छा है। जबकि यह बाहरी मॉड्यूल का उपयोग कर रहा है, यह स्ट्रिंग को एक संपूर्ण स्ट्रिंग के रूप में पेश कर रहा है। यह प्रक्रिया में क्या हो रहा है यह थोड़ा स्पष्ट है। – isaaclw

25

बहुत ही सरल, एक पंक्ति में के बाद से:

import re 
re.sub("(?i)hello","bye", "hello HeLLo HELLO") #'bye bye bye' 
re.sub("(?i)he\.llo","bye", "he.llo He.LLo HE.LLO") #'bye bye bye' 

या, तर्क वैकल्पिक "झंडे" का उपयोग करें:

import re 
re.sub("hello", "bye", "hello HeLLo HELLO", flags=re.I) #'bye bye bye' 
re.sub("he\.llo", "bye", "he.llo He.LLo HE.LLO", flags=re.I) #'bye bye bye' 
1

ब्लेयर कॉनराड की तरह स्ट्रिंग.रप्लेस इसका समर्थन नहीं करता है।

regex re.sub का उपयोग करें, लेकिन पहले प्रतिस्थापन स्ट्रिंग से बचने के लिए याद रखें। ध्यान दें कि re.sub के लिए 2.6 में कोई झंडे-विकल्प नहीं है, इसलिए आपको एम्बेडेड संशोधक '(?i)' (या आरई-ऑब्जेक्ट, ब्लेयर कॉनराड के उत्तर देखें) का उपयोग करना होगा। इसके अलावा, एक और गड़बड़ यह है कि यदि स्ट्रिंग दी जाती है तो उप-प्रतिस्थापन बैकस्लैश प्रतिस्थापन टेक्स्ट में भाग लेगा। इससे बचने के लिए इसके बजाय एक लैम्ब्डा में गुजर सकता है।

import re 
def ireplace(old, repl, text): 
    return re.sub('(?i)'+re.escape(old), lambda m: repl, text) 

>>> ireplace('hippo?', 'giraffe!?', 'You want a hiPPO?') 
'You want a giraffe!?' 
>>> ireplace(r'[binfolder]', r'C:\Temp\bin', r'[BinFolder]\test.exe') 
'C:\\Temp\\bin\\test.exe' 
0

मैं \ t escape sequences में बदला जा रहा (थोड़ा नीचे स्क्रॉल करें) हो रही थी, तो मैं ने कहा कि re.sub धर्मान्तरित दृश्यों से बचने के लिए भाग निकले पात्रों backslashed:

यहाँ एक समारोह है।

को रोकने के लिए है कि मैं निम्नलिखित लिखा है:

केस संवेदी बदलें।

import re 
    def ireplace(findtxt, replacetxt, data): 
     return replacetxt.join( re.compile(findtxt, flags=re.I).split(data) ) 
इसके अलावा

, यदि आप इसे अन्य उत्तर यहाँ विशेष अर्थ bashslash पात्रों दृश्यों से बचने के लिए परिवर्तित हो रही है उस तरह, भागने पात्रों के साथ बदलने के लिए, बस अपने खोज डिकोड और, या स्ट्रिंग की जगह चाहते हैं। अजगर 3 में, .decode की तरह कुछ करने के लिए ("unicode_escape") # python3

findtxt = findtxt.decode('string_escape') # python2 
replacetxt = replacetxt.decode('string_escape') # python2 
data = ireplace(findtxt, replacetxt, data) 

अजगर 2.7.8

आशा है कि मदद करता है में परीक्षण किया गया हो सकता है।

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