2010-07-29 47 views
1

此問題類似於this,只是要替換的子字符串僅在運行時才知道。如何以不區分大小寫的方式替換非靜態子字符串

我想要寫的ireplace的定義,其行爲是這樣的:

>>> ireplace(r'c:\Python26\lib\site.py', r'C:\python26', r'image\python26') 
r'image\python26\lib\site.py' 
>>> 
+0

以c:\開頭如果是這樣,那不僅僅是一個替代品。 – 2010-07-30 00:14:58

+0

@ Jon-Eric:那是我的錯,我修正了這個例子。 – 2010-07-30 17:05:31

回答

1

在這種情況下,我認爲這是最簡單的方法

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 
+0

嗯,隱含的假設是,我想保留輸入字符串的情況。您的解決方案不會保留大小寫。 – 2010-07-30 17:04:31

+0

@Sridhar,我用正則表達式添加了一個不區分大小寫的版本。你不應該使用'b'作爲正則表達式,只是'a' – 2010-07-30 23:14:49

+0

標記爲答案,因爲它比我的解決方案簡單。 – 2010-08-05 17:28:16

0
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)似乎裂傷的字符串,如果它有連字符。

+0

有些人遇到問題時,認爲 「我知道,我會用正則表達式。」現在他們有兩個問題。 – 2010-07-30 00:08:11

相關問題