Comparando cadenas usando Python

C

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 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 2.7.9 (default, Jun 29 2016, 13:08:31)
[GCC 4.9.2] on linux2
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 string y el re módulos, que contienen métodos para manejar coincidencias inexactas y sin distinción entre mayúsculas y minúsculas. En tercer lugar, para tratar con cadenas de varias líneas, módulo difflib es bastante útil. Varios ejemplos le ayudarán a comprender cómo utilizarlos.

Los operadores == y! =

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

en un for loop, una cadena que contiene el nombre de la ciudad suiza “Lausanne” se compara con una entrada de una lista de otros lugares, y el resultado de la comparación se imprime en stdout.

Listado 1:

# define strings
listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "Lausanne"

for place in listOfPlaces:
    print ("comparing %s with %s: %s" % (place, currentCity, place == currentCity))

Ejecutando 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

los == y is Operadores

Python tiene los dos operadores de comparación == y is. A primera vista parecen ser iguales, pero en realidad no lo son. == compara dos variables en función de su valor real. En contraste, el is el operador compara dos variables basadas en la identificación del objeto y devuelve True si las dos variables se refieren al mismo objeto.

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

>>> a = 1
>>> b = 1
>>> c = 2
>>> a is b
True
>>> a is c
False
>>> id(a)
10771520
>>> id(b)
10771520

Tan pronto como el valor cambie, Python reinstalará el 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 = 2
>>> id(b)
10771552
>>> id(c)
10771552

Una regla general a seguir es utilizar == al comparar tipos inmutables (como ints) y is al comparar objetos.

Más operadores de comparación

Para una comparación con 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 se ejecuta el código Python.

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

Listado 2:

# define the strings
listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "Lausanne"

for place in listOfPlaces:
    if place < currentCity:
            print ("%s comes before %s" % (place, currentCity))
    elif place > currentCity:
            print ("%s comes after %s" % (place, currentCity))
    else:
            print ("%s is similar to %s" % (place, currentCity))

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

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

Comparaciones 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 disponibles directamente como métodos del objeto de cadena correspondiente.

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

Listado 3:

# using the == operator
listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "lausANne"

for place in listOfPlaces:
    print ("comparing %s with %s: %s" % (place, currentCity, place.lower() == currentCity.lower()))

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

Usar una expresión regular

Una expresión regular, o “regex” para abreviar, define un patrón específico de caracteres. Respecto a este tema, Jeffrey Friedl escribió un excelente libro titulado Dominar las expresiones regulares, que recomiendo encarecidamente.

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 el 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 the additional module
import re

# define list of places
listOfPlaces = ["Bayswater", "Table Bay", "Bejing", "Bombay"]

# define search string
pattern = re.compile("[Bb]ay")

for place in listOfPlaces:
    if pattern.search(place):
        print ("%s matches the search pattern" % place)

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 listas y líneas múltiples

Hasta ahora, nuestras comparaciones 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 de diferencias.

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 realiza utilizando el compare() método en la línea 15. El resultado se imprime en stdout (línea 18).

Listado 5:

# import the additional module
import difflib
 
# define original text
# taken from: https://en.wikipedia.org/wiki/Internet_Information_Services
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."]

# define modified text
edited = ["About the IIS", "", "It has several improvements related", "to performance in large-scale scenarios."]

# initiate the Differ object
d = difflib.Differ()
 
# calculate the difference between the two texts
diff = d.compare(original, edited)
 
# output the result
print ('n'.join(diff))

La ejecución del 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.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad