Comparando cadenas usando Python

En Python, las cadenas son secuencias de caracteres que se almacenan efectivamente en la memoria como un objeto. Cada objeto se puede identificar mediante el id() método, como se puede ver a continuación. Python intenta reutilizar objetos en la memoria que tienen el mismo valor, lo que también hace que la comparación de objetos sea muy rápida en 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 cadenas, Python ofrece algunos operadores diferentes para hacerlo. Primero, los explicaremos con más detalle a continuación. En segundo lugar, repasaremos tanto el string y del re módulos, que contienen métodos para manejar coincidencias inexactas y que no distinguen entre mayúsculas y minúsculas. En tercer lugar, para tratar con cadenas de varias líneas, el modulo difflib es bastante útil Una serie de ejemplos le ayudarán a entender cómo usarlos.

Compara cadenas con los operadores == y !=

Como operador de comparación básico querrás usar == y !=. Funcionan exactamente de la misma manera que con valores enteros y flotantes. El == el operador regresa True si hay una coincidencia exacta, de lo contrario False Será devuelto. Por el contrario, el != el operador regresa True si no hay coincidencia y de lo contrario regresa False. Listado 1 Demuestra esto.

En un for bucle, una cadena que contiene el nombre de la ciudad suiza "Lausana" se compara con una entrada de una lista de otros lugares, y el resultado de la comparación se imprime en la salida estándar.

Listado 1:


listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "Lausanne"

for place in listOfPlaces:
    print (f"comparing {place} with {currentCity}: %{place == currentCity}")

Al ejecutar el script de Python desde arriba, el resultado es el siguiente:

$ python3 comparing-strings.py
comparing Berlin with Lausanne: False
comparing Paris with Lausanne: False
comparing Lausanne with Lausanne: True

La == y is telecomunicaciones

Python tiene los dos operadores de comparación. == y is. A primera vista parecen lo mismo, pero en realidad no lo son.

== compara dos variables en función del valor que representan. Por el contrario, el is El operador compara dos variables en función del ID del objeto en la memoria.

John (Doe) y John (Moe) se llaman John. Si podemos reducirlos a solo sus nombres, tendrían el mismo valor, pero serían dos personas cualitativamente diferentes.

El siguiente ejemplo demuestra eso para tres variables con valores de cadena. las dos variables a y b tienen el mismo valor, y Python se refiere al mismo objeto para minimizar el uso de memoria.

Esto se hace para tipos y cadenas simples de forma predeterminada, pero no para otros objetos:

>>> a = 'hello'
>>> b = 'hello'
>>> c = 'world'
>>> a is b
True
>>> a is c
False
>>> id(a)
140666888153840
>>> id(b)
140666888153840
>>> 

Tan pronto como cambie el valor, Python volverá a crear una instancia del objeto y asignará la variable. En el siguiente fragmento de código b obtiene el valor de 2, y posteriormente b y c se refieren al mismo objeto:

>>> b = 'world'
>>> id(b)
140666888154416
>>> id(c)
140666888154416

Más operadores de comparación

Para una comparación respecto a un orden lexicográfico puede utilizar los operadores de comparación <, >, <=y >=. La comparación en sí se hace carácter por carácter. El orden depende del orden de los caracteres en el alfabeto. Este orden depende de la tabla de caracteres que esté en uso en su máquina mientras ejecuta el código de Python.

Tenga en cuenta que el orden distingue entre mayúsculas y minúsculas. Como ejemplo del alfabeto latino, "Autobús" viene antes de "autobús". Listado 2 muestra cómo estos operadores de comparación funcionan en la práctica.

Listado 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}")

Al ejecutar el script de Python desde arriba, el resultado es el siguiente:

$ python3 comparing-strings-order.py
Berlin comes before Lausanne
Paris comes after Lausanne
Lausanne is equal to Lausanne

Comparaciones de cadenas que no distinguen entre mayúsculas y minúsculas

Los ejemplos anteriores se centraron en coincidencias exactas entre cadenas. Para permitir comparaciones que no distinguen entre mayúsculas y minúsculas, Python ofrece métodos de cadena especiales como upper() y lower(). Ambos están directamente disponibles como métodos del objeto de cadena correspondiente.

upper() convierte toda la cadena en letras mayúsculas, y lower() en minúsculas, respectivamente. Residencia en Listado 1 el siguiente listado muestra cómo usar el lower() método.

Consulte nuestra guía práctica y práctica para aprender Git, con las mejores prácticas, los estándares aceptados por la industria y la hoja de trucos incluida. Deja de buscar en Google los comandos de Git y, de hecho, aprenden ella!

Listado 3:


listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "lausANne"

for place in listOfPlaces:
    print (f"comparing {place} with {place.lower() == currentCity.lower()}: {currentCity}")

El resultado es el siguiente:

$ python3 comparing-strings-case-insensitive.py
comparing Berlin with lausANne: False
comparing Paris with lausANne: False
comparing Lausanne with lausANne: True

Comparar cadenas usando expresiones regulares (RegEx)

A Expresión Regular – o “regex” para abreviar – define un patrón específico de caracteres.

Para hacer uso de este mecanismo en Python, importe el re módulo primero y definir un patrón específico, a continuación. Nuevamente, el siguiente ejemplo se basa en Listado 1. El patrón de búsqueda coincide con "bahía" y comienza con una letra minúscula o mayúscula. Precisamente, el siguiente código de Python encuentra todas las cadenas en las que se produce el patrón de búsqueda sin importar en qué posición de la cadena: al principio, en el medio o al final.

Listado 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")

El resultado es el siguiente y coincide con "Bayswater", "Table Bay" y "Bombay" de la lista de lugares:

$ python3 comparing-strings-re.py
Bayswater matches the search pattern
Table Bay matches the search pattern
Bombay matches the search pattern

Comparaciones de varias líneas y listas

Hasta ahora, nuestras comparaciones solo se han basado en unas pocas palabras. Utilizando el difflib El módulo Python también ofrece una forma de comparar cadenas de varias líneas y listas completas de palabras. La salida se puede configurar de acuerdo con varios formatos de herramientas diff.

El siguiente ejemplo (Listado 5) compara dos cadenas de varias líneas línea por línea y muestra tanto las eliminaciones como las adiciones. Después de la inicialización del Differ objeto en la línea 12 la comparación se hace usando el compare() método en la línea 15. El resultado se imprime en la salida estándar:


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))

Ejecutar el script crea la salida como se ve a continuación. Las líneas con supresiones se indican mediante - signos mientras que las líneas con adiciones comienzan con un + firmar. Además, las líneas con cambios comienzan con un signo de interrogación. Los cambios se indican mediante ^ señales en la posición correspondiente. Las líneas sin indicador siguen siendo las mismas:

$ 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.

Conclusión

En este artículo, ha aprendido varias formas de comparar cadenas en Python. Esperamos que esta descripción general lo ayude a programar de manera efectiva en la vida de su desarrollador.

Agradecimientos

El autor quisiera agradecer a Mandy Neumeyer por su apoyo mientras preparaba el artículo.

Sello de tiempo:

Mas de Abuso de pila