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

11 投票
7 回答
7525 浏览
提问于 2025-04-15 23:45

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

abc -> def
Abc -> Def
aBc -> dEf
abC -> deF

我可以用Python怎么做这个呢?

7 个回答

5

这里有一种使用正则表达式的方法。关键在于,当它找到匹配的内容时,首先会调整替换字符串的大小写,以和匹配的内容一致。这是可行的,因为 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
7

在Mark Byers的回答基础上,这里有一个可以处理任何长度替换文本的解决方案。
关键在于将一个函数传递给 re.sub()

import re
def case_sensitive_replace(string, old, new):
    """ replace occurrences of old with new, within string
        replacements will match the case of the text it replaces
    """
    def repl(match):
        current = match.group()
        result = ''
        all_upper=True
        for i,c in enumerate(current):
            if i >= len(new):
                break
            if c.isupper():
                result += new[i].upper()
            else:
                result += new[i].lower()
                all_upper=False
        #append any remaining characters from new
        if all_upper:
            result += new[i+1:].upper()
        else:
            result += new[i+1:].lower()
        return result

    regex = re.compile(re.escape(old), re.I)
    return regex.sub(repl, string)

print case_sensitive_replace("abc Abc aBc abC ABC",'abc','de')
print case_sensitive_replace("abc Abc aBc abC ABC",'abc','def')
print case_sensitive_replace("abc Abc aBc abC ABC",'abc','defg')

结果:

de De dE de DE
def Def dEf deF DEF
defg Defg dEfg deFg DEFG
8
from string import maketrans

"Abc".translate(maketrans("abcABC", "defDEF"))

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。

撰写回答