pro*_*eek 6 python string replace
我需要以区分大小写的方式替换字符串.例如
abc -> def Abc -> Def aBc -> dEf abC -> deF
我可以用Python做什么?
from string import maketrans
"Abc".translate(maketrans("abcABC", "defDEF"))
Run Code Online (Sandbox Code Playgroud)
这是一个使用正则表达式的方法.关键点在于,当它找到匹配时,它首先修改替换字符串以匹配匹配字符串的大小写.这是有效的,因为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)
Run Code Online (Sandbox Code Playgroud)
结果:
def -> def Def -> Def dEf -> dEf deF -> deF
扩展 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')
Run Code Online (Sandbox Code Playgroud)
结果:
de De dE de DE
def Def dEf deF DEF
defg Defg dEfg deFg DEFG
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4050 次 |
最近记录: |