re – Operaciones con expresiones regulares¶

Sintaxis de expresiones regulares¶

Una expresión regular (o RE) especifica un conjunto de cadenas que coinciden con ella; lasfunciones de este módulo permiten comprobar si una cadena concreta coincide con una expresión regular dada (o si una expresión regular dada coincide con una cadena concreta, que viene a ser lo mismo).

Las expresiones regulares pueden concatenarse para formar nuevas expresiones regulares; si A y B son ambas expresiones regulares, entonces AB es también una expresión regular. Esto es así a menos que A o B contengan operaciones de baja precedencia; condiciones de frontera entre A y B; o tengan referencias de grupo numeradas. Así, las expresiones complejas pueden construirse fácilmente a partir de expresiones primitivas más sencillas como las descritas aquí. Para más detalles sobre la teoría e implementación de las expresiones regulares, consulte el libro de Friedl, o casi cualquier libro de texto sobre construcción de compiladores.

A continuación se ofrece una breve explicación del formato de las expresiones regulares. Para más información y una presentación más suave, consulte el CÓMO de expresiones regulares.

Las expresiones regulares pueden contener tanto caracteres especiales como ordinarios. La mayoría de los caracteres ordinarios, como 'A', 'a' o '0', son las expresiones regulares más sencillas; simplemente coinciden con ellas mismas. Puede concatenar caracteres ordinarios, por lo que last coincide con la cadena 'last'. (En el resto de esta sección, escribiremos los RE en this special style, normalmente sin comillas, y las cadenas que deben coincidir en 'in single quotes'.)

Algunos caracteres, como '|' o '(', son especiales. Los caracteres especiales representan clases de caracteres ordinarios o afectan a la interpretación de las expresiones regulares que los rodean.

Los calificadores de repetición (*, +, ?, {m,n}, etc.) no pueden anidarse directamente. Esto evita la ambigüedad con el sufijo modificador?, y con otros modificadores en otras implementaciones. Para aplicar una segunda repetición a una repetición interior, se pueden utilizar paréntesis. Por ejemplo, la expresión (?:a{6})* coincide con cualquier múltiplo de seis caracteres 'a'.

Los caracteres especiales son:

.

(Punto.) En el modo por defecto, esto coincide con cualquier carácter excepto una nueva línea. Si se ha especificado la bandera DOTALL, coincide con cualquier carácter, incluyendo una nueva línea.

^

(Caret.) Coincide con el comienzo de la cadena, y en el modo MULTILINE también coincide inmediatamente después de cada nueva línea.

$

Comparte el final de la cadena o justo antes de la nueva línea al final de la cadena, y en el modo MULTILINE también coincide antes de una nueva línea. fooEmpareja tanto ‘foo’ como ‘foobar’, mientras que la expresión regular foo$ coincide sólo con ‘foo’. Más interesante, la búsqueda de foo.$ en 'foo1\nfoo2\n' coincide con ‘foo2’ normalmente, pero con ‘foo1’ en el modo MULTILINE; la búsqueda de un solo $ en 'foo\n' encontrará dos coincidencias (vacías): una justo antes de la nueva línea y otra al final de la cadena.

*

Hace que la RE resultante coincida con 0 o más repeticiones de la RE precedente, tantas como sea posible. ab*Coincidirá con ‘a’, ‘ab’, o ‘a’ seguido de cualquier número de ‘b’.

+

Hace que el RE resultante coincida con 1 o más repeticiones del RE precedente.ab+Coincidirá con ‘a’ seguido de cualquier número no nulo de ‘b’; no coincidirá sólo con ‘a’.

?

Hace que el RE resultante coincida con 0 o 1 repeticiones del RE precedente.ab? coincidirá con ‘a’ o ‘ab’.

*?,+?,??

Los calificadores '*', '+' y '?' son todos codiciosos; coinciden con la mayor cantidad de texto posible. A veces este comportamiento no es el deseado; si el RE<.*> se compara con '<a> b <c>', coincidirá con toda la cadena, y no sólo con '<a>'. Añadir ? después del calificador hace que se realice la coincidencia de forma mínima o no codiciosa; se compararán el menor número de caracteres posible. Usando el RE <.*?> coincidirá solamente con '<a>'.

{m}

Especifica que exactamente m copias del RE anterior deben ser coincididas; menosmatches hacen que el RE entero no coincida. Por ejemplo, a{6} coincidirá exactamente con seis caracteres de 'a', pero no con cinco.

{m,n}

Hace que el RE resultante coincida con entre m y n repeticiones delRE anterior, intentando coincidir con tantas repeticiones como sea posible. Por ejemplo, a{3,5} coincidirá de 3 a 5 caracteres 'a'. La omisión de m especifica un límite inferior de cero, y la omisión de n especifica un límite superior infinito. Como ejemplo, a{4,}b coincidirá con 'aaaab' o con mil caracteres 'a' seguidos de un 'b', pero no con 'aaab'. La coma no puede omitirse o el modificador se confundiría con la forma descrita anteriormente.

{m,n}?

Hace que el RE resultante coincida con m a n repeticiones delRE precedente, intentando coincidir con el menor número de repeticiones posible. Se trata de la versión no exhaustiva del calificador anterior. Por ejemplo, en la cadena de 6 caracteres 'aaaaaa', a{3,5} coincidirá con 5 caracteres 'a', mientras que a{3,5}? sólo coincidirá con 3 caracteres.

\

Escapa caracteres especiales (permitiéndole coincidir con caracteres como'*', '?', etc.), o señala una secuencia especial; las secuencias especiales se discuten más adelante.

Si no está usando una cadena cruda para expresar el patrón, recuerde que Pythonal también usa la barra invertida como una secuencia de escape en los literales de cadena; si la secuencia de escape no es reconocida por el analizador de Python, la barra invertida y el carácter subsiguiente se incluyen en la cadena resultante. Sin embargo, si Python reconociera la secuencia resultante, la barra invertida debería repetirse dos veces. Esto es complicado y difícil de entender, por lo que se recomienda encarecidamente el uso de cadenas de caracteres para todas las expresiones, excepto las más simples.

Se utiliza para indicar un conjunto de caracteres. En un conjunto:

  • Los caracteres pueden ser listados individualmente, por ejemplo, coincidirá con 'a','m', o 'k'.

  • Se pueden indicar rangos de caracteres dando dos caracteres y separándolos con un '-', por ejemplo coincidirá con cualquier letra ASCII minúscula, coincidirá con todos los números de dos dígitos desde 00 hasta 59, y coincidirá con cualquier dígito hexadecimal. Si - se escapa (por ejemplo, ) o si se coloca como primer o último carácter (por ejemplo, o ), coincidirá con un literal '-'.

  • Los caracteres especiales pierden su significado especial dentro de los conjuntos. Por ejemplo, coincidirá con cualquiera de los caracteres literales '(', '+', '*' o ')'.

  • Las clases de caracteres como \w o \S (definidas a continuación) también se aceptan dentro de un conjunto, aunque los caracteres con los que coinciden dependen de si está en vigor el modo ASCII o LOCALE.

  • Los caracteres que no están dentro de un rango pueden coincidir complementando el conjunto. Si el primer carácter del conjunto es '^', todos los caracteres que no estén en el conjunto serán comparados. Por ejemplo, coincidirá con cualquier carácter excepto '5', y coincidirá con cualquier carácter excepto'^'. ^ no tiene ningún significado especial si no es el primer carácter del conjunto.

  • Para que coincida con un literal ']' dentro de un conjunto, precederlo con una barra invertida, o colocarlo al principio del conjunto. Por ejemplo, tanto {}] como() coincidirán con un paréntesis.

  • En el futuro podría añadirse el soporte de conjuntos anidados y operaciones de conjuntos como en el Unicode TechnicalStandard #18. Esto cambiaría la sintaxis, por lo que para facilitar este cambio un FutureWarning se planteará en los casos ambiguos por el momento.Eso incluye los conjuntos que comienzan con un literal '.

    (...)

    Empareja cualquier expresión regular que está dentro de los paréntesis, e indica el inicio y el final de un grupo; el contenido de un grupo puede ser recuperado después de que un partido se ha realizado, y puede ser emparejado más tarde en la cadena con la secuencia especial \number, que se describe a continuación. Para hacer coincidir los literales '(' o ')', utilice \( o \), o enciérrelos dentro de una clase de caracteres: , .

    (?...)

    Esta es una notación de extensión (un '?' que sigue a un '(' no tiene sentido de otra manera). El primer carácter tras el '?' determina el significado y la sintaxis posterior de la construcción. Las extensiones no suelen crear un nuevo grupo; (?P<name>...) es la única excepción a esta regla. A continuación se indican las extensiones actualmente admitidas.

    (?aiLmsux)

    (Una o más letras del conjunto 'a', 'i', 'L', 'm','s', 'u', 'x'). El grupo coincide con la cadena vacía; las letras establecen las banderas correspondientes: re.A (coincidencia sólo ASCII), re.I (ignorar mayúsculas y minúsculas), re.L (dependiente de la localización), re.M (multilínea), re.S (el punto coincide con todo), re.U (coincidencia Unicode), y re.X (verboso), para toda la expresión regular. (Las banderas se describen en Contenido del módulo.)Esto es útil si desea incluir las banderas como parte de la expresión regular, en lugar de pasar un argumento de bandera a la funciónre.compile(). Las banderas deben usarse primero en la cadena de expresión.

    (?:...)

    Una versión no capturadora de paréntesis regulares. Coincide con cualquier expresión regular que esté dentro de los paréntesis, pero la subcadena coincidente con el grupo no puede recuperarse después de realizar una coincidencia o referenciarse más adelante en el patrón.

    (?aiLmsux-imsx:...)

    (Cero o más letras del conjunto 'a', 'i', 'L', 'm','s', 'u', 'x', opcionalmente seguidas de '-' seguidas deuna o más letras de 'i', 'm', 's', 'x'.)Las letras fijan o eliminan los indicadores correspondientes:re.A (coincidencia sólo ASCII), re.I (ignorar mayúsculas y minúsculas),re.L (dependiente de la localización), re.M (multilínea),re.S (el punto coincide con todo), re.U (coincidencia Unicode), y re.X (verboso), para la parte de la expresión.(Los indicadores se describen en Contenido del módulo.)

    Las letras 'a', 'L' y 'u' son mutuamente excluyentes cuando se utilizan como indicadores en línea, por lo que no pueden combinarse ni seguir a '-'. En cambio, cuando una de ellas aparece en un grupo en línea, anula el modo de coincidencia en el grupo que la rodea. En los patrones Unicode, (?a:...) cambia a coincidencia sólo ASCII, y (?u:...) cambia a coincidencia Unicode (por defecto). En los patrones de bytes, (?L:...) cambia a la concordancia dependiente de la configuración regional y (?a:...) cambia a la concordancia sólo ASCII (por defecto).Esta anulación sólo tiene efecto para el grupo estrecho en línea, y el modo de concordancia original se restablece fuera del grupo.

    Nuevo en la versión 3.6.

    Cambiado en la versión 3.7: Las letras 'a', 'L' y 'u' también se pueden utilizar en un grupo.

    (?P<name>...)

    Similar a los paréntesis regulares, pero la subcadena coincidente con el grupo es accesible a través del nombre simbólico del grupo. Los nombres de grupo deben ser identificadores válidos de Python, y cada nombre de grupo debe definirse sólo una vez dentro de una expresión regular. Un grupo simbólico es también un grupo numerado, como si el grupo no tuviera nombre.

    Los grupos con nombre pueden ser referenciados en tres contextos. Si el patrón es(?P<quote>).*?(?P=quote) (es decir que coincide con una cadena entre comillas simples o dobles):

    Contexto de referencia al grupo «entrecomillado»

    Modo de referenciarlo

    en el propio patrón

      .

    • (?P=quote) (como se muestra)

    al procesar el objeto de coincidencia m

    • m.group('quote')

    • m.end('quote') (etc.)

    en una cadena pasada al replargumento de re.sub()

    • \g<quote>

    • \g<1>

    (?P=name)

    Una retro-referencia a un grupo con nombre; coincide con cualquier texto que coincida con el nombre del grupo anterior.

    (?#...)

    Un comentario; el contenido de los paréntesis simplemente se ignora.

    (?=...)

    Coincide si ... coincide con el siguiente, pero no consume nada de la cadena. Esto se llama una aserción lookahead. Por ejemplo, Isaac (?=Asimov) coincidirá con'Isaac ' sólo si va seguido de 'Asimov'.

    (?!...)

    Combina si ... no coincide con la siguiente. Por ejemplo, Isaac (?!Asimov) coincidirá con 'Isaac ' sólo si no va seguido de 'Asimov'.

    (?<=...)

    Combina si la posición actual de la cadena está precedida por una coincidencia de ... que termina en la posición actual. Esto se llama un lookbehindassertion positivo. (?<=abc)def encontrará una coincidencia en 'abcdef', ya que el lookbehind retrocederá 3 caracteres y comprobará si el patrón contenido coincide.El patrón contenido sólo debe coincidir con cadenas de cierta longitud fija, lo que significa queabc o a|b están permitidos, pero a* y a{3,4} no. Tenga en cuenta que los patrones que comienzan con afirmaciones de búsqueda positiva no coincidirán con el principio de la cadena que se busca; lo más probable es que desee utilizar la función search() en lugar de la función match():

    >>> import re>>> m = re.search('(?<=abc)def', 'abcdef')>>> m.group(0)'def'

    Este ejemplo busca una palabra después de un guión:

    >>> m = re.search(r'(?<=-)\w+', 'spam-egg')>>> m.group(0)'egg'

    Cambiado en la versión 3.5: Se ha añadido soporte para las referencias de grupo de longitud fija.

    (?<!...)

    Se busca si la posición actual en la cadena no está precedida por una coincidencia para.... Esto se llama una aserción lookbehind negativa. Al igual que las afirmaciones de búsqueda positiva, el patrón contenido sólo debe coincidir con cadenas de cierta longitud fija. Los patrones que comienzan con aserciones lookbehind negativas pueden coincidir al principio de la cadena que se busca.

    (?(id/name)yes-pattern|no-pattern)

    Intentará coincidir con yes-pattern si el grupo con id o nombre dado existe, y con no-pattern si no existe. no-pattern es opcional y puede omitirse. Por ejemplo, (<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$) es un patrón de coincidencia de correo electrónico pobre, que coincidirá con '<[email protected]>' así como con '[email protected]', pero no con '<[email protected]' ni con '[email protected]>'.

    Las secuencias especiales consisten en '\' y un carácter de la lista siguiente.Si el carácter ordinario no es un dígito ASCII o una letra ASCII, el RE resultante coincidirá con el segundo carácter. Por ejemplo, $ coincide con el carácter '$'.

    \number

    Concuerda con el contenido del grupo del mismo número. Los grupos se numeran a partir del 1. Por ejemplo, (.+) coincide con 'the the' o '55 55', pero no con 'thethe' (nótese el espacio después del grupo). Esta secuencia especial sólo puede utilizarse para coincidir con uno de los primeros 99 grupos. Si el primer dígito del número es 0, o el número tiene 3 dígitos octales, no se interpretará como una coincidencia de grupo, sino como el carácter con valor octal número. Dentro del'' de una clase de caracteres, todos los escapes numéricos se tratan como caracteres.

    \A

    Sólo coincide con el inicio de la cadena.

    \b

    Compara la cadena vacía, pero sólo al principio o al final de una palabra.Una palabra se define como una secuencia de caracteres de palabras. Tenga en cuenta que, formalmente, \b se define como el límite entre un carácter \w y uno \W (o viceversa), o entre \w y el principio/final de la cadena.Esto significa que r'\bfoo\b' coincide con 'foo', 'foo.', '(foo)', 'bar foo baz' pero no con 'foobar' o 'foo3'.

    Por defecto, los alfanuméricos Unicode son los que se utilizan en los patrones Unicode, pero esto puede cambiarse utilizando la bandera ASCII. Los límites de las palabras están determinados por la configuración regional actual si se utiliza la bandera LOCALE.Dentro de un rango de caracteres, \b representa el carácter de retroceso, para la compatibilidad con los literales de cadena de Python.

    \B

    Coincide con la cadena vacía, pero sólo cuando no está al principio o al final de una palabra. Esto significa que r'py\B' coincide con 'python', 'py3','py2', pero no con 'py', 'py.' o 'py!'.\B es justo lo contrario de \b, por lo que los caracteres de las palabras en los patrones Unicod son alfanuméricos Unicode o el guión bajo, aunque esto puede cambiarse utilizando la bandera ASCII. Los límites de las palabras están determinados por la configuración regional actual si se utiliza la bandera LOCALE.

    \d Para patrones Unicode (str):

    Empareja cualquier dígito decimal Unicode (es decir, cualquier carácter de la categoría de caracteres Unicode ). Esto incluye , y también muchos otros caracteres de dígitos. Si se utiliza el indicador ASCII, sólo se compara con .

    Para patrones de 8 bits (bytes):

    Empareja cualquier dígito decimal; esto es equivalente a .

    \D

    Empareja cualquier carácter que no sea un dígito decimal. Es lo contrario de \d. Si se utiliza el indicador ASCII, se convierte en el equivalente de .

    \s Para patrones Unicode (str):

    Recoge los caracteres de espacio en blanco de Unicode (que incluye, y también muchos otros caracteres, por ejemplo los espacios de ruptura exigidos por las reglas tipográficas de muchos idiomas). Si se utiliza la bandera ASCII, sólo se compara con.

    Para patrones de 8 bits (bytes):

    Empareja caracteres considerados como espacios en blanco en el conjunto de caracteres ASCII; esto es equivalente a .

    \S

    Empareja cualquier carácter que no sea un carácter de espacio en blanco. Es lo contrario de \s. Si se utiliza el indicador ASCII, se convierte en el equivalente de .

    \w Para patrones Unicode (str):

    Empareja caracteres de palabra Unicode; esto incluye la mayoría de los caracteres que pueden formar parte de una palabra en cualquier idioma, así como los números y el guión bajo. Si se utiliza el indicador ASCII, sólo se busca .

    Para patrones de 8 bits (bytes):

    Empareja caracteres considerados alfanuméricos en el conjunto de caracteres ASCII; esto equivale a . Si se utiliza el indicador LOCALE, coincide con los caracteres considerados alfanuméricos en la configuración regional actual y con el guión bajo.

    \W

    Concuerda con cualquier carácter que no sea una palabra. Es lo contrario de \w. Si se utiliza el indicador ASCII, se convierte en el equivalente de . Si se utiliza el indicador LOCALE, coincide con los caracteres que no son alfanuméricos en el local actual ni con el guión bajo.

    \Z

    Sólo coincide con el final de la cadena.

    La mayoría de los escapes estándar soportados por los literales de cadena de Python también son aceptados por el analizador de expresiones regulares:

    \a \b \f \n\N \r \t \u\U \v \x \

    (Tenga en cuenta que \b se utiliza para representar los límites de las palabras, y significa «retroceso «sólo dentro de las clases de caracteres.)

    '\u', '\U', y '\N' secuencias de escape sólo se reconocen en Unicodepatrones. En los patrones de bytes son errores. Los escapes desconocidos de letras ASCII se reservan para su uso futuro y se tratan como errores.

    Los escapes octales se incluyen de forma limitada. Si el primer dígito es un 0, o si hay tres dígitos octales, se considera un escape octal. En caso contrario, se trata de una referencia de grupo. Como en el caso de los literales de cadena, los escapes octales tienen siempre un máximo de tres dígitos.

    Cambiado en la versión 3.3: Se han añadido las secuencias de escape '\u' y '\U'.

    Cambiado en la versión 3.6: Los escapes desconocidos consistentes en '\' y una letra ASCII ahora son errores.

    Cambiado en la versión 3.8: Se ha añadido la secuencia de escape '\N{name}'. Como en los literales de cadena, se expande al carácter Unicode nombrado (por ejemplo, '\N{EM DASH}').

Deja una respuesta

Tu dirección de correo electrónico no será publicada.