此問題類似於this,只是要替換的子字符串僅在運行時才知道。如何以不區分大小寫的方式替換非靜態子字符串
我想要寫的ireplace
的定義,其行爲是這樣的:
>>> ireplace(r'c:\Python26\lib\site.py', r'C:\python26', r'image\python26')
r'image\python26\lib\site.py'
>>>
此問題類似於this,只是要替換的子字符串僅在運行時才知道。如何以不區分大小寫的方式替換非靜態子字符串
我想要寫的ireplace
的定義,其行爲是這樣的:
>>> ireplace(r'c:\Python26\lib\site.py', r'C:\python26', r'image\python26')
r'image\python26\lib\site.py'
>>>
在這種情況下,我認爲這是最簡單的方法
r'c:\Python26\lib\site.py'.lower().replace('python26', r'image\python26')
對於不區分大小寫,正則表達式是你*肯定*您不希望返回的字符串的最簡單方法
>>> def ireplace(s, a, b):
... return re.sub("(?i)"+re.escape(a),b,s)
...
>>> print ireplace(r'c:\Python26\lib\site.py', 'C:\python26', r'image\python26')
image\python26\lib\site.py
嗯,隱含的假設是,我想保留輸入字符串的情況。您的解決方案不會保留大小寫。 – 2010-07-30 17:04:31
@Sridhar,我用正則表達式添加了一個不區分大小寫的版本。你不應該使用'b'作爲正則表達式,只是'a' – 2010-07-30 23:14:49
標記爲答案,因爲它比我的解決方案簡單。 – 2010-08-05 17:28:16
def ireplace(s, a, b):
"""Replace `a` with `b` in s without caring about case"""
re_a = re.compile(re.escape(a), re.IGNORECASE)
return re_a.sub(lambda m: b, s)
注:lambda m: b
黑客是必要的,因爲re.escape(b)
似乎裂傷的字符串,如果它有連字符。
有些人遇到問題時,認爲 「我知道,我會用正則表達式。」現在他們有兩個問題。 – 2010-07-30 00:08:11
以c:\開頭如果是這樣,那不僅僅是一個替代品。 – 2010-07-30 00:14:58
@ Jon-Eric:那是我的錯,我修正了這個例子。 – 2010-07-30 17:05:31