我需要以区分大小写的方式替换字符串。例如
abc -> def Abc -> Def aBc -> dEf abC -> deF
我可以用Python做什么?
答案 0 :(得分:7)
from string import maketrans
"Abc".translate(maketrans("abcABC", "defDEF"))
答案 1 :(得分: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
答案 2 :(得分:2)
扩展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
答案 3 :(得分:1)
很长一段时间潜伏着,我以为我会在这里发布一个建议,因为其中一些似乎相当复杂。
print map(lambda a, b: b.lower() if a.islower() else b.upper(), "aBc", "def")
它确实假设两个字符串的长度相同,但您可以使用适当的函数轻松替换lambda,并在第一个输入时检查None。
答案 4 :(得分:0)
re
模块可能正是您所需要的。具体来说,re.sub
函数可用于简单的字符串搜索/替换。
答案 5 :(得分:0)
不是最有效的方式,而且非常粗糙,但可能这样的事情可行:
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)
答案 6 :(得分:0)
据我所知,您想根据第一个字符串更改第二个字符串大小写。 我对吗?所以,我的解决方案如下。字符串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
答案 7 :(得分:0)
虽然您可能希望添加一些字符串长度相同的检查,但这样可以正常工作:
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))))