замена строки с учетом регистра в Python - PullRequest
6 голосов
/ 09 июня 2010

Мне нужно заменить строку в чувствительном к регистру пути. Например

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

Что я могу сделать с Python?

Ответы [ 8 ]

7 голосов
/ 09 июня 2010
from string import maketrans

"Abc".translate(maketrans("abcABC", "defDEF"))
5 голосов
/ 09 июня 2010

Вот метод с использованием регулярных выражений. Ключевым моментом является то, что когда он находит совпадение, он сначала изменяет строку замены, чтобы соответствовать регистру совпадающей строки. Это работает, потому что 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 голосов
/ 18 июля 2013

Расширяя ответ Марка Байерса, Вот решение, которое работает для замены текста любой длины.
Хитрость в том, чтобы отправить функцию на 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
1 голос
/ 09 июня 2010

Долгое время скрывался, думал, что я опубликую предложение здесь, поскольку некоторые из них кажутся довольно запутанными.

print map(lambda a, b: b.lower() if a.islower() else b.upper(), "aBc", "def")

Предполагается, что обе строки имеют одинаковую длину, однако вы можете легко заменить лямбду направильная функция и проверьте None на первом входе.

0 голосов
/ 09 июня 2010

Это будет работать, хотя вы, вероятно, захотите добавить некоторые проверки, что длины строк одинаковы:

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))))
0 голосов
/ 09 июня 2010

Я понимаю, что Вы хотите изменить регистр второй строки в соответствии с первой строкой. Я прав? Итак, мое решение заключается в следующем. Строка s2 меняет свой регистр в соответствии с соответствующей строкой s1. Результат запоминается в с3. Здесь предполагается, что две строки имеют одинаковую длину.

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
0 голосов
/ 09 июня 2010

Не самый эффективный способ, и он очень грубый, но, вероятно, что-то вроде этого может сработать:

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)
0 голосов
/ 09 июня 2010

Модуль re, вероятно, то, что вы ищете. В частности, функция re.sub может использоваться для простого поиска / замены строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...