python - मामला असंवेदनशील प्रतिस्थापन




string case-insensitive (8)

पायथन में केस-असंवेदनशील स्ट्रिंग प्रतिस्थापन करने का सबसे आसान तरीका क्या है?


Answers

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

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'

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

>>> 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'

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

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))

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

बीएफएलओच के जवाब पर जारी रखते हुए, यह फ़ंक्शन एक में बदलाव नहीं करेगा, लेकिन पुराने रूप से सभी घटनाएं - एक मामले में असंवेदनशील फैशन में।

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

इसके लिए 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):] 

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

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'

आप उन आदेशों को अपने vimrc में उपयोग कर सकते हैं:

  • set ignorecase - आपकी सभी खोजें केस असंवेदनशील होंगी
  • set smartcase - यदि आपकी अपरकेस अक्षर है तो आपकी खोज केस संवेदनशील होगी

मैंने हाल ही में विम खोज कमांड के बारे में एक लेख लिखा है (दोनों कमांड में निर्मित हैं और कुशलता से खोजने के लिए सर्वोत्तम प्लगइन्स)।





python string case-insensitive