Замена без учета регистра

Какой самый простой способ выполнения замены строки без учета регистра в Python?

вопрос задан 28.05.2009
Adam Ernst
18057 репутация

8 ответов


  • 166 рейтинг

    Тип 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'
    
    ответ дан Blair Conrad, с репутацией 145093, 28.05.2009
  • 63 рейтинг
    import re
    pattern = re.compile("hello", re.IGNORECASE)
    pattern.sub("bye", "hello HeLLo HELLO")
    # 'bye bye bye'
    
    ответ дан Unknown, с репутацией 33884, 28.05.2009
  • 31 рейтинг

    В одну строку:

    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'
    

    Или используйте необязательный аргумент flags:

    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'
    
    ответ дан viebel, с репутацией 4951, 14.03.2012
  • 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
    
    ответ дан rsmoorthy, с репутацией 1549, 23.01.2011
  • 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):] 
    
    ответ дан bFloch, с репутацией 87, 21.01.2011
  • 1 рейтинг

    Как Блэр Конрад говорит строку. замена не поддерживает это.

    Используйте регулярное выражение re.sub, но не забудьте сначала экранировать строку замены. Обратите внимание, что в 2 нет опции flags. 6 для re.sub, так что вам придется использовать встроенный модификатор '(?i)' (или RE-объект, см. Ответ Блэра Конрада). Кроме того, другая ловушка заключается в том, что sub будет обрабатывать экранирование обратной косой черты в тексте замены, если задана строка. Чтобы избежать этого, можно вместо этого перейти в лямбду.

    Вот функция:

    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'
    
    ответ дан johv, с репутацией 2396, 5.04.2013
  • 0 рейтинг

    никогда не публиковал ответ раньше, и эта ветка действительно старая, но я придумал другое решение и решил, что могу получить ваш ответ. Я не опытный программист на Python, поэтому, если у него есть явные недостатки, пожалуйста, укажите его, так как он хорошо изучен :)

    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))
    
    ответ дан anddan, с репутацией 21, 16.02.2012
  • 0 рейтинг

    Я был преобразован в escape-последовательности (прокрутите немного вниз), поэтому я заметил, что re. sub преобразует экранированные символы обратной косой черты в экранирующие последовательности.

    Чтобы предотвратить это, я написал следующее:

    Заменить без учета регистра.

    import re
        def ireplace(findtxt, replacetxt, data):
            return replacetxt.join(  re.compile(findtxt, flags=re.I).split(data)  )
    

    Кроме того, если вы хотите заменить его на escape-символы, как и в других ответах, которые получают специальные символы bashslash, преобразованные в escape-последовательности, просто декодируйте находку и или заменяйте строку. В Python 3, возможно, придется сделать что-то вроде. decode ("unicode_escape") # python3

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

    Проверено в Python 2. 7. 8

    Надеюсь, что помогает.

    ответ дан Stan S. - Lee, с репутацией 111, 28.10.2014