import re
texto = "ABC ABC. ABC.png ABC thumb.png"
regex = r"ABC(?!.png)|ABC(?! thumb.png)"
novo = re.sub(regex, "bueno", texto)
print(novo)
Estou tentando substituir a palavra ABC por exceções. Só quero substituí-la se ela não vier depois da palavra ".png" ou "thumb.png". A string seria então "ABC thumb.png"
Eu esperava
bueno bueno. ABC.png ABC thumb.png
Mas a saída é esta
bueno bueno. bueno.png bueno thumb.png
Ele não detecta o espaço e, na verdade, bagunça a primeira condição.
Começando com seu padrão original:
Isto corresponderá
ABC
a which is not followed by.png
ouABC
not followed bythumb.png
. Cada ocorrência possível deABC
corresponderá a este padrão. Portanto, todas as ocorrências deABC
serão match, porque cada extensão corresponderá a pelo menos uma das duas condições.Podemos escrever a seguinte correção:
Este padrão diz para combinar:
\b
limite de palavraABC
corresponderABC
(?!\.png| thumb\.png)
nem segue.png
thumb.png
O lookahead negativo usado aqui tem basicamente uma lógica com sabor AND e excluirá ambas as extensões seguintes.
O OR (
|
) precisa estar dentro do lookahead negativo:Vamos pegar a substring
ABC.png
como um exemplo do que estava acontecendo com seu padrão original. O mecanismo regex tentaria primeiro corresponder a isso usandoABC(?!.png)
, o que falharia por causa do lookahead negativo. Então, por causa do OR, ele pularia para o próximo caso,ABC(?! thumb.png)
. Isso corresponderia aABC.png
, o que significa que a string seria substituída.Você pode tornar
thumb
opcional dentro do lookahead:A expressão regular corresponde a:
\bABC
Correspondência ABC precedida por um limite de palavra para evitar uma correspondência parcial de palavras(?!
Visão negativa à frente, afirma que o que está diretamente à direita não está(?: thumb)?
Correspondência opcionalthumb
\.png
Corresponder.png
)
Feche o lookaheadVeja uma demonstração do regex 101
Observe que se .png também não deve ter uma correspondência parcial de palavras no final, você também pode ter um limite de palavras como
.png\b
Isso substituirá
'ABC'
por'bueno'
somente se não for seguido por'.png'
ou' thumb.png'
.RESULTADO:
NOTA: No regex, adicionado
\b
no final deABC
=>\bABC\b
, para que não corresponda se houver outro caractere de palavra após a letraC
. Por exemplo, não corresponderá a 'ABCd' ou 'zABCd' .