Python中区分大小写的字符串替换

Python中区分大小写的字符串替换,python,string,replace,Python,String,Replace,我需要以区分大小写的方式替换字符串。比如说 abc -> def Abc -> Def aBc -> dEf abC -> deF abc->def Abc->Def aBc->dEf abC->deF 我可以用Python做些什么呢?这不是最有效的方法,而且非常粗糙,但类似的方法可能会奏效: def case_insensitive_replace(string, old, new): upper_indices = [idx for idx, char in enumerate(st

我需要以区分大小写的方式替换字符串。比如说

abc -> def Abc -> Def aBc -> dEf abC -> deF abc->def Abc->Def aBc->dEf abC->deF
我可以用Python做些什么呢?

这不是最有效的方法,而且非常粗糙,但类似的方法可能会奏效:

def case_insensitive_replace(string, old, new):
    upper_indices = [idx for idx, char in enumerate(string) if char.isupper()]
    replaced = list(string.lower().replace(old.lower(), new.lower()))
    for idx in upper_indices:
        replaced[idx] = replaced[idx].upper()
    return "".join(replaced)

这里有一个使用正则表达式的方法。关键点是,当找到匹配项时,它首先修改替换管柱,以匹配匹配管柱的套管。这是因为
re.sub
可以用函数代替字符串

import re

def case_sensitive_replace(s, before, after):
    regex = re.compile(re.escape(before), re.I)
    return regex.sub(lambda x: ''.join(d.upper() if c.isupper() else d.lower()
                                       for c,d in zip(x.group(), after)), s)

test = '''
abc -> def
Abc -> Def
aBc -> dEf
abC -> deF
'''

result = case_sensitive_replace(a, 'abc', 'def')
print(result)
结果:

def -> def Def -> Def dEf -> dEf deF -> deF
de De dE de DE
def Def dEf deF DEF
defg Defg dEfg deFg DEFG
定义->定义 定义->定义 定义->定义 定义->定义
我知道您想根据第一个字符串更改第二个字符串的大小写。 我说得对吗?因此,我的解决方案如下。字符串s2根据对应的字符串s1更改其大小写。结果存储在s3中。这里的一个假设是两个字符串具有相同的长度

s1 = "AaBb"
s2 = "cdef"
s3 = ""
index = 0
length = len(s1)

while(True):
    if s1[index].isupper():
        temp = s2[index].upper()
    else:
        temp = s2[index].lower()
    s3 = s3 + temp
    index +=1
    if index == length:
        break
print s3

长期潜伏者,我想我会在这里发布一个建议,因为其中一些似乎相当复杂

print map(lambda a, b: b.lower() if a.islower() else b.upper(), "aBc", "def")

它确实假设两个字符串的长度相同,但是您可以轻松地用适当的函数替换lambda,并在第一次输入时检查无值。

这将起作用,尽管您可能希望添加一些检查,以确保字符串长度相同:

string1 = "AbcDEFghiJKLmnO"
string2 = "some other text"

string2 = "".join((string2[i].upper() if string1[i].isupper() else string2[i].lower() 
                   for i in range(len(string1))))

扩展马克·拜尔斯的答案,这里有一个解决方案,它适用于任何长度的替换文本
诀窍是向发送函数

结果:

def -> def Def -> Def dEf -> dEf deF -> deF
de De dE de DE
def Def dEf deF DEF
defg Defg dEfg deFg DEFG

@标记:wiki使用上/下字符作为wiki名称。我需要替换一些wiki名称。“wSg”的替换名称是什么?您所问问题的答案可能对您试图解决的问题没有帮助。如果前后有不同的长度怎么办?@Mark:实际上,我只是根据一小部分规则替换字符串,而不是尝试替换所有可能的wiki名称组合。所以,威廉·泰尔的回答对我来说很有效。感谢您的回答。这假设同一个字符在输入字符串中不会出现两次。这不适用于将“foo”替换为“bar”,因为“o”字符必须根据上下文映射到“a”或“r”。