在Python中做不区分大小写的字符串替换最简单的方法是什么?


当前回答

在一行中:

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'

其他回答

继续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

关于语法细节和选项的有趣观察:

win32上的Python 3.7.2 (tags/v3.7.2:9a3ffc0492, december 23 2018, 23:09:28) [MSC v.1916 64位(AMD64)]

import re
old = "TREEROOT treeroot TREerOot"
re.sub(r'(?i)treeroot', 'grassroot', old)

草根的,草根的

re.sub(r'treeroot', 'grassroot', old)

" TREEROOT grassroot TREEROOT "

re.sub(r'treeroot', 'grassroot', old, flags=re.I)

草根的,草根的

re.sub(r'treeroot', 'grassroot', old, re.I)

" TREEROOT grassroot TREEROOT "

因此,在匹配表达式中添加(?i)前缀或添加“flags=re.”I”作为第四个参数将导致不区分大小写的匹配。 但是,仅使用“re.I”作为第四个参数不会导致不区分大小写的匹配。

相比较而言,

re.findall(r'treeroot', old, re.I)

['TREEROOT', 'TREEROOT', 'TREEROOT']

re.findall(r'treeroot', old)

[“树根”]

这并不需要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'

或者,使用可选的"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'
import re
pattern = re.compile("hello", re.IGNORECASE)
pattern.sub("bye", "hello HeLLo HELLO")
# 'bye bye bye'