Coincidencia de patrones en Python con Regex

Requisito previo: Python RegEx

Es posible que esté familiarizado con la búsqueda de texto presionando ctrl-F y escribiendo las palabras que está buscando. Las expresiones regulares van un paso más allá: le permiten especificar un patrón de texto para buscar.
Las expresiones regulares, llamadas regex para abreviar, son descripciones de un patrón de texto. Por ejemplo, \d en una expresión regular representa un carácter de dígito, es decir, cualquier número único del 0 al 9.

  • La siguiente expresión regular se usa en Python para hacer coincidir una string de tres números, un guión, tres números más, otro guión y cuatro números.
    Any other string would not match the pattern.
    \d\d\d-\d\d\d-\d\d\d\d
  • Las expresiones regulares pueden ser mucho más sofisticadas. Por ejemplo, agregar un 3 entre corchetes ({3}) después de un patrón es como decir: «Haz coincidir este patrón tres veces». Así que la expresión regular ligeramente más corta
    \d{3}-\d{3}-\d{4}

    (Coincide con el formato de número de teléfono correcto).

Crear objeto Regex

Todas las funciones de expresiones regulares en Python están en el módulo re

import re

Para crear un objeto Regex que coincida con el patrón del número de teléfono, ingrese lo siguiente en el shell interactivo.

phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')

Ahora la variable phoneNumRegex contiene un objeto Regex.

Coincidencia de objetos regex

El método search() de un objeto Regex busca en la string que se le pasa cualquier coincidencia con la expresión regular. Los objetos de coincidencia tienen un método group() que devolverá el texto coincidente real de la string buscada.

# Python program to illustrate
# Matching regex objects
import re
phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
mo = phoneNumRegex.search('My number is 415-555-4242.')
print('Phone number found: ' + mo.group())

Producción:

Phone number found: 415-555-4242

Pasos de la coincidencia de expresiones regulares

Si bien hay varios pasos para usar expresiones regulares en Python, cada paso es bastante simple.

  1. Importe el módulo regex con import re.
  2. Cree un objeto Regex con la función re.compile(). (Recuerde usar una string sin procesar).
  3. Pase la string que desea buscar en el método search() del objeto Regex. Esto devuelve un objeto Match.
  4. Llame al método group() del objeto Match para devolver una string del texto coincidente real.
  5. Agrupación con paréntesis

    1. Objetos coincidentes: supongamos que desea separar el código de área del resto del número de teléfono. Agregar paréntesis creará grupos en la expresión regular: (\d\d\d)-(\d\d\d-\d\d\d\d). Luego puede usar el método de objeto de coincidencia group() para obtener el texto coincidente de un solo grupo.

      # Python program to illustrate
      # Matching regex objects
      # with grouping 
      import re
      phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
      mo = phoneNumRegex.search('My number is 415-555-4242.')
      print(mo.group(1))

      PRODUCCIÓN:

      '415'
      
    2. Recuperar todos los grupos a la vez: si desea recuperar todos los grupos a la vez, use el método groups(), tenga en cuenta la forma plural del nombre.

      # Python program to illustrate
      # Matching regex objects
      # with groups 
      import re
      phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
      mo = phoneNumRegex.search('My number is 415-555-4242.')
      print(mo.groups())

      PRODUCCIÓN:

      ('415', '555-4242')
    3. Usando mo.groups: mo.groups() devolverá una tupla de valores múltiples, puede usar el truco de asignación múltiple para asignar cada valor a una variable separada, como en el siguiente código de área, mainNumber = mo.groups() línea.

      # Python program to illustrate
      # Matching regex objects
      # with mo.groups() 
      import re
      phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
      mo = phoneNumRegex.search('My number is 415-555-4242.')
      areaCode, mainNumber = mo.groups()
      print(mainNumber)

      PRODUCCIÓN:

      '555-4242'
    4. Haga coincidir un paréntesis: los paréntesis tienen un significado especial en las expresiones regulares, pero ¿qué hace si necesita hacer coincidir un paréntesis en su texto? Por ejemplo, tal vez los números de teléfono que está tratando de hacer coincidir tengan el código de área entre paréntesis. En este caso, debe escapar de los caracteres ( y ) con una barra invertida. Ingrese lo siguiente en el shell interactivo:

      # Python program to illustrate
      # Matching regex objects
      # with grouping 
      import re
      phoneNumRegex = re.compile(r'(\(\d\d\d\)) (\d\d\d-\d\d\d\d)')
      mo = phoneNumRegex.search('My phone number is (415) 555-4242.')
      print(mo.group(1))

      PRODUCCIÓN:

      '(415)'

      Los caracteres de escape \( y \) en la string sin formato pasada a re.compile() coincidirán con los caracteres de paréntesis reales.

    Coincidencia de varios grupos con la tubería

    el | carácter se llama tubería. Puede usarlo en cualquier lugar que desee para que coincida con una de las muchas expresiones. Por ejemplo, la expresión regular r’Batman|Tina Fey’ coincidirá con ‘Batman’ o ‘Tina Fey’.

    Cuando tanto Batman como Tina Fey aparecen en la string buscada, la primera aparición de texto coincidente se devolverá como el objeto Match. Ingrese lo siguiente en el shell interactivo:

    # Python program to illustrate
    # Matching regex objects
    # with multiple Groups with the Pipe
    import re
    heroRegex = re.compile (r'Batman|Tina Fey')
    mo1 = heroRegex.search('Batman and Tina Fey.')
    print(mo1.group())

    PRODUCCIÓN:

    'Batman'

    Coincidencia de repeticiones específicas con corchetes

    Si tiene un grupo que desea repetir una cantidad específica de veces, siga al grupo en su expresión regular con un número entre llaves. Por ejemplo, la expresión regular (Ha){3} coincidirá con la string ‘HaHaHa’, pero no con ‘HaHa’, ya que esta última tiene solo dos repeticiones del grupo (Ha).

    En lugar de un número, puede especificar un rango escribiendo un mínimo, una coma y un máximo entre llaves. Por ejemplo, la expresión regular (Ha){3, 5} coincidirá con ‘HaHaHa’, ‘HaHaHaHa’ y ‘HaHaHaHaHa’.

    También puede omitir el primer o segundo número entre llaves para dejar el mínimo o el máximo sin límites. Por ejemplo, (Ha){3, } coincidirá con tres o más instancias del grupo (Ha), mientras que (Ha){, 5} coincidirá con cero a cinco instancias. Los corchetes pueden ayudar a acortar las expresiones regulares. Estas dos expresiones regulares coinciden con patrones idénticos:

    (Ha){3}
    (Ha)(Ha)(Ha)

    Y estas dos expresiones regulares también coinciden con patrones idénticos:

    (Ha){3, 5}
    ((Ha)(Ha)(Ha))|((Ha)(Ha)(Ha)(Ha))|((Ha)(Ha)(Ha)(Ha)(Ha))

    Ingrese lo siguiente en el shell interactivo:

    # Python program to illustrate
    # Matching Specific Repetitions 
    # with Curly Brackets
    import re
    haRegex = re.compile(r'(Ha){3}')
    mo1 = haRegex.search('HaHaHa')
    print(mo1.group())

    PRODUCCIÓN:

    'HaHaHa'

    # Python program to illustrate
    # Matching Specific Repetitions 
    # with Curly Brackets
    import re
    haRegex = re.compile(r'(Ha){3}')
    mo2 = haRegex.search('Ha')== None
    print(mo2)

    PRODUCCIÓN:

    True
    

    Aquí, (Ha){3} coincide con ‘HaHaHa’ pero no con ‘Ha’. Dado que no coincide con ‘Ha’, search() devuelve Ninguno.

    Emparejamiento opcional con el signo de interrogación

    A veces hay un patrón que desea hacer coincidir solo opcionalmente. Es decir, la expresión regular debe encontrar una coincidencia ya sea que ese fragmento de texto esté allí o no. el ? carácter marca el grupo que lo precede como una parte opcional del patrón. Por ejemplo, ingrese lo siguiente en el shell interactivo:

    # Python program to illustrate
    # optional matching
    # with question mark(?)
    import re
    batRegex = re.compile(r'Bat(wo)?man')
    mo1 = batRegex.search('The Adventures of Batman')
    print(mo1.group())

    PRODUCCIÓN:

    'Batman'

    # Python program to illustrate
    # optional matching
    # with question mark(?)
    import re
    batRegex = re.compile(r'Bat(wo)?man')
    mo2 = batRegex.search('The Adventures of Batwoman')
    print(mo2.group())

    PRODUCCIÓN:

    'Batwoman'

    El (wo)? parte de la expresión regular significa que el patrón wo es un grupo opcional. La expresión regular coincidirá con el texto que tiene cero instancias o una instancia de wo en él. Esta es la razón por la que la expresión regular coincide tanto con ‘Batwoman’ como con ‘Batman’.
    ¿Puedes pensar en el? como si dijera: «Haga coincidir cero o uno del grupo que precede a este signo de interrogación».
    Si necesita hacer coincidir un carácter de signo de interrogación real, escápelo con \?.

    Coincidencia de cero o más con la estrella

    El * (llamado estrella o asterisco) significa «coincidencia con cero o más»: el grupo que precede a la estrella puede aparecer cualquier número de veces en el texto. Puede estar completamente ausente o repetirse una y otra vez. Veamos de nuevo el ejemplo de Batman.

    # Python program to illustrate
    # matching a regular expression
    # with asterisk(*)
    import re
    batRegex = re.compile(r'Bat(wo)*man')
    mo1 = batRegex.search('The Adventures of Batman')
    print(mo1.group())

    PRODUCCIÓN:

    'Batman'

    #python program to illustrate
    #matching a regular expression
    #with asterisk(*)
    import re
    batRegex = re.compile(r'Bat(wo)*man')
    mo2 = batRegex.search('The Adventures of Batwoman')
    print(mo2.group())

    PRODUCCIÓN:

    'Batwoman'

    # Python program to illustrate
    # matching a regular expression
    # with asterisk(*)
    import re
    batRegex = re.compile(r'Bat(wo)*man')
    mo3 = batRegex.search('The Adventures of Batwowowowoman')
    print(mo3.group())

    PRODUCCIÓN:

    'Batwowowowoman'

    Para ‘Batman’, la parte (wo)* de la expresión regular coincide con cero instancias de wo en la string; para ‘Batwoman’, el (wo)* coincide con una instancia de wo; y para ‘Batwowowowoman’, (wo)* coincide con cuatro instancias de wo.

    Si necesita hacer coincidir un carácter de estrella real, prefije la estrella en la expresión regular con una barra invertida, \*.

    Coincidencia de uno o más con el Plus

    Mientras que * significa «coincidir con cero o más», el + (o más) significa «coincidir con uno o más». A diferencia de la estrella, que no requiere que su grupo aparezca en la string coincidente, el grupo que precede a un signo más debe aparecer al menos una vez. No es opcional. Ingrese lo siguiente en el shell interactivo y compárelo con las expresiones regulares de estrella en la sección anterior:

    # Python program to illustrate
    # matching a regular expression
    # with plus(+)
    import re
    batRegex = re.compile(r'Bat(wo)+man')
    mo1 = batRegex.search('The Adventures of Batwoman')
    print(mo1.group())

    PRODUCCIÓN:

    'Batwoman'

    # Python program to illustrate
    # matching a regular expression
    # with plus(+)
    import re
    batRegex = re.compile(r'Bat(wo)+man')
    mo2 = batRegex.search('The Adventures of Batwowowowoman')
    print(mo2.group())

    PRODUCCIÓN:

    'Batwowowowoman'

    batRegex = re.compile(r’Bat(wo)+man’)

    # Python program to illustrate
    # matching a regular expression
    # with plus(+)
    import re
    batRegex = re.compile(r'Bat(wo)+man')
    mo3 = batRegex.search('The Adventures of Batman')== None
    print(mo3)

    PRODUCCIÓN:

    True

    La expresión regular Bat(wo)+man no coincidirá con la string ‘The Adventures of Batman’ porque el signo más requiere al menos un wo.

    Si necesita hacer coincidir un carácter de signo más real, prefije el signo más con una barra invertida para escapar: \+.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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