Comparando Strings usando Python

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, o is 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.

Carimbo de hora:

Mais de Abuso de pilha