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

     

    Etiquetas:

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *