不区分大小写replace
在Python中执行不区分大小写的stringreplace最简单的方法是什么?
string
types不支持这个。 您可能最好使用re.IGNORECASE选项使用正则expression式子方法 。
>>> 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'
import re pattern = re.compile("hello", re.IGNORECASE) pattern.sub("bye", "hello HeLLo HELLO") # 'bye bye bye'
非常简单,只需一行:
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
这不需要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):]
像Blair Conrad说的那样,string.replace不支持这个。
使用正则expression式re.sub
,但记得首先逃避replacestring。 请注意,2.6中没有用于re.sub
标志选项,因此您必须使用embedded修饰符'(?i)'
(或RE对象,请参阅Blair Conrad的答案)。 此外,另一个缺陷是,如果给出一个string,sub将在replace文本中处理反斜杠转义。 为了避免这个可以传入一个lambda。
这是一个function:
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'
我没有被转换为转义序列 (向下滚动),所以我注意到re.sub将反斜杠转义字符转换为转义序列。
为了防止我写下以下内容:
replace大小写不敏感。
import re def ireplace(findtxt, replacetxt, data): return replacetxt.join( re.compile(findtxt, flags=re.I).split(data) )
另外,如果你希望它用转义字符来replace,就像这里得到特殊含义的bashslash字符转换为转义序列的其他答案,只要解码你的查找和,或replacestring。 在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.8testing
希望有所帮助。
从来没有发布过答案,而这个线程真的很老,但我想出了另一种解决方法,并认为我可以得到你的答复,我没有在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))