Qual é a maneira mais fácil de fazer uma substituição de string que não diferencia maiúsculas de minúsculas no Python?
python
string
case-insensitive
Adam Ernst
fonte
fonte
'hippo'
, mas seria útil se o valor de substituição fosse passado para uma função, por isso é realmente mais um bom exemplo do que qualquer outra coisa.re.escape
usar sua agulha, há outra armadilha aqui, que esta resposta falha em evitar, observada em stackoverflow.com/a/15831118/1709587 : como osre.sub
processos escapam das seqüências, conforme observado em docs.python.org/library/re.html#re .sub , você precisa escapar de todas as barras invertidas na cadeia de substituição ou usar uma lambda.fonte
re.sub('hello', 'bye', 'hello HeLLo HELLO', flags=re.IGNORECASE)
re.sub
apenas suporta este sinalizador desde o Python 2.7.Em uma única linha:
Ou use o argumento opcional "flags":
fonte
Continuando na resposta do bFloch, essa função mudará não uma, mas todas as ocorrências antigas com as novas - de uma maneira que não faz distinção entre maiúsculas e minúsculas.
fonte
Como Blair Conrad diz que string.replace não suporta isso.
Use o regex
re.sub
, mas lembre-se de escapar primeiro da cadeia de substituição. Observe que não há opção de sinalizadores no 2.6 parare.sub
, então você terá que usar o modificador incorporado'(?i)'
(ou um objeto RE, consulte a resposta de Blair Conrad). Além disso, outra armadilha é que o sub processará escapes de barra invertida no texto de substituição, se uma string for fornecida. Para evitar isso, pode-se passar um lambda.Aqui está uma função:
fonte
Esta função usa as funções
str.replace()
ere.findall()
. Ele substituirá todas as ocorrências depattern
instring
porrepl
uma maneira que não diferencia maiúsculas de minúsculas.fonte
Isso não requer RegularExp
fonte
Uma observação interessante sobre detalhes e opções de sintaxe:
Python 3.7.2 (tags / v3.7.2: 9a3ffc0492, 23 de dezembro de 2018, 23:09:28) [MSC v.1916 de 64 bits (AMD64)] no win32
«grassroot grassroot grassroot»
«TREEROOT base TREerOot»
«grassroot grassroot grassroot»
«TREEROOT base TREerOot»
Portanto, o prefixo (? I) na expressão de correspondência ou a adição de "flags = re.I" como quarto argumento resultará em uma correspondência que não diferencia maiúsculas de minúsculas. MAS, usar apenas "re.I" como o quarto argumento não resulta em correspondência que não diferencia maiúsculas de minúsculas.
Para comparação,
['TREEROOT', 'treeroot', 'TREerOot']
['treeroot']
fonte
Como estava sendo convertido para as seqüências de escape (role um pouco para baixo), observei que re.sub converte caracteres de escape com barra invertida para escapar de seqüências.
Para impedir que eu escrevi o seguinte:
Substitua maiúsculas e minúsculas.
Além disso, se você desejar que ele substitua pelos caracteres de escape, como as outras respostas aqui que estão obtendo os caracteres de bashslash com significado especial convertidos em seqüências de escape, decodifique sua localização e ou substitua a string. No Python 3, pode ser necessário fazer algo como .decode ("unicode_escape") # python3
Testado em Python 2.7.8
Espero que ajude.
fonte
nunca postou uma resposta antes e este tópico é realmente antigo, mas eu vim com outra solução e achei que poderia obter sua resposta. Não sou experiente na programação Python, portanto, se houver inconvenientes aparentes, indique-os desde o seu bom aprendizado: )
fonte