做一个不区分大小写的替换的最佳方法,但匹配要替换的单词的情况?

Jar*_*red 7 python string replace match

到目前为止,我已经提出了下面的方法,但我的问题是有一个更短的方法,有相同的结果吗?

我的代码:

input_str       = "myStrIngFullOfStUfFiWannAReplaCE_StUfFs"
replace_str     = "stuff"
replacer_str    = "banana"


print input_str
# prints: myStrIngFullOfStUfFiWannAReplaCE_StUfFs

if replace_str.lower() in input_str.lower():            # Check if even in the string
    begin_index = input_str.lower().find( replace_str )
    end_index   = begin_index + len( replace_str )

    replace_section = input_str[ begin_index : end_index ]

    case_list = []
    for char in replace_section:                        # Get cases of characters in the section to be replaced
        case_list.append( char.istitle() )

    while len( replacer_str ) > len(case_list):
        case_list += case_list

    sameCase_replacer_str   = ""                        # Set match the replacer string's case to the replace
    replacer_str            = replacer_str.lower()
    for index in range( len(replacer_str) ):
        char = replacer_str[ index ]
        case = case_list[ index ]
        if case == True:
            char = char.title()

        sameCase_replacer_str += char

    input_str = input_str.replace( replace_section , sameCase_replacer_str )

print input_str
# prints: myStrIngFullOfBaNaNAiWannAReplaCE_BaNaNAs
Run Code Online (Sandbox Code Playgroud)

jco*_*ado 5

我会用这样的东西:

import re

def replacement_func(match, repl_pattern):
    match_str = match.group(0)
    repl = ''.join([r_char if m_char.islower() else r_char.upper()
                   for r_char, m_char in zip(repl_pattern, match_str)])
    repl += repl_pattern[len(match_str):]
    return repl

input_str = "myStrIngFullOfStUfFiWannAReplaCE_StUfFs"
print re.sub('stuff',
             lambda m: replacement_func(m, 'banana'),
             input_str, flags=re.I)
Run Code Online (Sandbox Code Playgroud)

示例输出:

myStrIngFullOfBaNaNaiWannAReplaCE_BaNaNas

笔记:

  • 这处理了不同匹配具有不同大写/小写组合的情况.
  • 假设替换模式是小写的(无论如何都很容易改变).
  • 如果替换模式比匹配长,则使用与模式中相同的情况.