Em Python, strings são sequências de caracteres, que são efetivamente armazenadas na memória como um objeto. Cada objeto pode ser identificado usando o id()
método, como você pode ver abaixo. Python tenta reutilizar objetos na memória que possuem o mesmo valor, o que também torna a comparação de objetos muito rápida em Python:
$ python
Python 3.9.0 (v3.9.0:9cf6752276, Oct 5 2020, 11:29:23)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = "abc"
>>> b = "abc"
>>> c = "def"
>>> print (id(a), id(b), id(c))
(139949123041320, 139949123041320, 139949122390576)
>>> quit()
Para comparar strings, Python oferece alguns operadores diferentes para fazer isso. Primeiro, iremos explicá-los com mais detalhes a seguir. Em segundo lugar, examinaremos os dois string
e os votos de re
módulos, que contêm métodos para lidar com correspondências inexatas e sem distinção entre maiúsculas e minúsculas. Terceiro, para lidar com strings multilinhas, o módulo diflib é bastante útil. Vários exemplos ajudarão você a entender como usá-los.
Compare Strings com os operadores == e!
Como operador de comparação básico, você desejará usar ==
e !=
. Eles funcionam exatamente da mesma maneira que valores inteiros e flutuantes. O ==
operador retorna True
se houver uma correspondência exata, caso contrário False
será retornado. Em contrapartida, o !=
operador retorna True
se não houver correspondência e caso contrário retorna False
. Listagem 1 demonstra isso.
Em um artigo do for
loop, uma string contendo o nome da cidade suíça “Lausanne” é comparada com uma entrada de uma lista de outros lugares, e o resultado da comparação é impresso em stdout.
Listagem 1:
listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "Lausanne"
for place in listOfPlaces:
print (f"comparing {place} with {currentCity}: %{place == currentCity}")
Executando o script Python acima, a saída é a seguinte:
$ python3 comparing-strings.py
comparing Berlin with Lausanne: False
comparing Paris with Lausanne: False
comparing Lausanne with Lausanne: True
A ==
e is
Operadores
Python tem dois operadores de comparação ==
e is
. À primeira vista parecem iguais, mas na verdade não são.
==
compara duas variáveis com base no valor que elas representam. Em contrapartida, ois
O operador compara duas variáveis com base no ID do objeto na memória.
John (Doe) e John (Moe) são ambos chamados de John. Se pudermos reduzi-los apenas aos seus nomes, eles seriam iguais em valor, mas ainda seriam duas pessoas qualitativamente diferentes.
O próximo exemplo demonstra isso para três variáveis com valores de string. As duas variáveis a
e b
têm o mesmo valor e Python se refere ao mesmo objeto para minimizar o uso de memória.
Isso é feito para tipos e strings simples por padrão, mas não para outros objetos:
>>> a = 'hello'
>>> b = 'hello'
>>> c = 'world'
>>> a is b
True
>>> a is c
False
>>> id(a)
140666888153840
>>> id(b)
140666888153840
>>>
Assim que o valor mudar, o Python irá reinstanciar o objeto e atribuir a variável. No próximo trecho de código b
obtém o valor de 2 e subsequentemente b
e c
referem-se ao mesmo objeto:
>>> b = 'world'
>>> id(b)
140666888154416
>>> id(c)
140666888154416
Mais operadores de comparação
Para uma comparação referente a uma ordem lexicográfica você pode usar os operadores de comparação <
, >
, <=
e >=
. A comparação em si é feita caractere por caractere. A ordem depende da ordem dos caracteres do alfabeto. Esta ordem depende da tabela de caracteres que está em uso em sua máquina durante a execução do código Python.
Lembre-se de que a ordem diferencia maiúsculas de minúsculas. Como exemplo para o alfabeto latino, “Ônibus” vem antes de “ônibus”. Listagem 2 mostra como esses operadores de comparação funcionam na prática.
Listagem 2:
listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "Lausanne"
for place in listOfPlaces:
if place < currentCity:
print (f"{place} comes before {currentCity}")
elif place > currentCity:
print (f"{place} comes after {currentCity}")
else:
print (f"{place} is equal to {currentCity}")
Executando o script Python acima, a saída é a seguinte:
$ python3 comparing-strings-order.py
Berlin comes before Lausanne
Paris comes after Lausanne
Lausanne is equal to Lausanne
Comparações de strings sem distinção entre maiúsculas e minúsculas
Os exemplos anteriores focaram em correspondências exatas entre strings. Para permitir comparações que não diferenciam maiúsculas de minúsculas, o Python oferece métodos especiais de string, como upper()
e lower()
. Ambos estão diretamente disponíveis como métodos do objeto string correspondente.
upper()
converte a string inteira em letras maiúsculas e lower()
em letras minúsculas, respectivamente. Baseado em Listagem 1 a próxima listagem mostra como usar o lower()
método.
Confira nosso guia prático e prático para aprender Git, com práticas recomendadas, padrões aceitos pelo setor e folha de dicas incluída. Pare de pesquisar comandos Git no Google e realmente aprender -lo!
Listagem 3:
listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "lausANne"
for place in listOfPlaces:
print (f"comparing {place} with {place.lower() == currentCity.lower()}: {currentCity}")
O resultado é o seguinte:
$ python3 comparing-strings-case-insensitive.py
comparing Berlin with lausANne: False
comparing Paris with lausANne: False
comparing Lausanne with lausANne: True
Compare strings usando expressões regulares (RegEx)
A Expressão Regular – ou “regex” para abreviar – define um padrão específico de caracteres.
Para fazer uso deste mecanismo em Python, importe o re
módulo primeiro e defina um padrão específico, a seguir. Novamente, o exemplo a seguir é baseado em Listagem 1. O padrão de pesquisa corresponde a “baía” e começa com uma letra minúscula ou maiúscula. Precisamente, o código Python a seguir encontra todas as strings nas quais o padrão de pesquisa ocorre, não importa em qual posição da string – no início, no meio ou no final.
Listagem 4:
import re
listOfPlaces = ["Bayswater", "Table Bay", "Bejing", "Bombay"]
pattern = re.compile("[Bb]ay")
for place in listOfPlaces:
if pattern.search(place):
print (f"{place} matches the search pattern")
A saída é a seguinte e corresponde a “Bayswater”, “Table Bay” e “Bombay” da lista de lugares:
$ python3 comparing-strings-re.py
Bayswater matches the search pattern
Table Bay matches the search pattern
Bombay matches the search pattern
Comparações multilinhas e de lista
Até agora, nossas comparações foram baseadas apenas em algumas palavras. Usando o difflib
O módulo Python também oferece uma maneira de comparar strings multilinhas e listas inteiras de palavras. A saída pode ser configurada de acordo com vários formatos de ferramentas de comparação.
O próximo exemplo (Listagem 5) compara duas strings multilinha linha por linha e mostra exclusões e adições. Após a inicialização do Differ
objeto na linha 12 a comparação é feita usando o compare()
método na linha 15. O resultado é impresso na saída padrão:
import difflib
original = ["About the IIS", "", "IIS 8.5 has several improvements related", "to performance in large-scale scenarios, such", "as those used by commercial hosting providers and Microsoft's", "own cloud offerings."]
edited = ["About the IIS", "", "It has several improvements related", "to performance in large-scale scenarios."]
d = difflib.Differ()
diff = d.compare(original, edited)
print ('n'.join(diff))
A execução do script cria a saída conforme mostrado abaixo. As linhas com exclusões são indicadas por -
sinais, enquanto as linhas com acréscimos começam com um +
sinal. Além disso, as linhas com alterações começam com um ponto de interrogação. As alterações são indicadas usando ^
sinais na posição correspondente. As linhas sem indicador ainda são as mesmas:
$ python comparing-strings-difflib.py
About the IIS
- IIS 8.5 has several improvements related
? ^^^^^^
+ It has several improvements related
? ^
- to performance in large-scale scenarios, such
? ^^^^^^
+ to performance in large-scale scenarios.
? ^
- as those used by commercial hosting providers and Microsoft's
- own cloud offerings.
Conclusão
Neste artigo você aprendeu várias maneiras de comparar strings em Python. Esperamos que esta visão geral ajude você a programar de forma eficaz na vida do seu desenvolvedor.
Agradecimentos
O autor gostaria de agradecer a Mandy Neumeyer pelo apoio na preparação do artigo.