Python 替换后保持大写的不区分大小写的正则表达式?

Python 替换后保持大写的不区分大小写的正则表达式?,python,regex,Python,Regex,在Python中,下面的代码允许我一致地替换编写得最合理的文本大小写。比如说,如果from_子字符串是“the”,而我的_字符串包含“theater”,那么它就有bug,但这只是为了说明我想做什么 def cap_preserving_replace(my_string, from_substring, to_substring): temp = my_string.replace(from_substring.lower(), to_substring.lower()) tem

在Python中,下面的代码允许我一致地替换编写得最合理的文本大小写。比如说,如果from_子字符串是“the”,而我的_字符串包含“theater”,那么它就有bug,但这只是为了说明我想做什么

def cap_preserving_replace(my_string, from_substring, to_substring):
    temp = my_string.replace(from_substring.lower(), to_substring.lower())
    temp = temp.replace(from_substring.upper(), to_substring.upper())
    temp = temp.replace(from_substring.title(), to_substring.title())
    return temp
但是,我还希望(在更罕见的情况下)能够进行以下类型的转换:

before -> afters
Before -> Afters
BEFORE -> AFTERS
BeFoRe -> AfTeRs
我的通用代码很难看。虽然我可能只想替换较低、较高和标题的大小写,但代码对它们来说并不重要,但我想知道是否有一个好的正则表达式可以保留资本化方案。下面的代码执行此操作,将
abc
转换为
def

import re

begin_string = 'abc'
end_string = 'def'

def case_keep_replace(my_string, begin_string = 'abc', end_string = 'def'):
    offsets = [m.start() for m in re.finditer(begin_string, my_string, re.IGNORECASE)]
    for x in offsets:
        temp_string = ''
        for y in range(0, len(begin_string)):
            if my_string[x+y].islower():
                temp_string += end_string[y]
            else:
                temp_string += end_string[y].upper()
        my_string = my_string[:x] + temp_string + my_string[x + len(temp_string):]
    return my_string

process_string = "All 8: abc, abC, aBc, aBC, Abc, AbC, ABc, ABC."

print("BEFORE:", process_string)
print("AFTERS: ", case_keep_replace(process_string))

是否有合适的正则表达式用于case\u keep\u replace


(注意:对于
case\u keep\u replace
,代码还应该检查from\u substring和to\u substring的长度是否相同,但我想将代码块集中在主要问题上。)

这里的要点是,您需要将
re.MatchData
对象传递到回调方法或lambda,用作
re.sub
的第二个参数

但是,您当前的代码需要简化一点,下面是您的代码的外观:

重新导入
def案例保存替换(m,结束字符串):
临时字符串=“”
对于范围(0,len(m.group())中的y:
如果m.group()[y].islower():
临时字符串+=结束字符串[y]
其他:
临时字符串+=结束字符串[y]。上限()
返回临时字符串+结束字符串[y+1:]
#现在,测试
process_string=“全部8:abc,abc,abc,abc,abc,abc,abc。”#输入字符串
begin_string='abc'#实际模式
结束字符串='def'#替换字符串
打印(处理字符串)
打印(re.sub(begin\u string,lambda m:case\u keep\u replace(m,end\u string),process\u string,flags=re.I))
#=>全部8个:abc,abc,abc,abc,abc,abc,abc,abc,abc,abc。
#全部8个:def,def,def,def,def,def,def,def。


注意:我在th
return temp\u string+end\u string[y+1:][/code>中添加了
end\u string[y+1:][/code>,以避免丢失剩余的
end\u string
替换,请参见。

re.sub()
中使用函数作为替换。它应该查看原始字符串中的大小写模式,并将其应用于替换字符串。感谢您的解释。我以前使用过函数,但有点简单。所以我很失望,我没有坐下来,并作出全面的飞跃,我非常感谢你清理我的逻辑代码。