Python 3 - Expresiones regulares
Una expresión regular es una secuencia especial de caracteres que le ayuda a hacer coincidir o encontrar otras cadenas o conjuntos de cadenas, utilizando una sintaxis especializada contenida en un patrón. Las expresiones regulares se utilizan ampliamente en el mundo UNIX.
El módulo reproporciona soporte completo para expresiones regulares similares a Perl en Python. losre el módulo genera la excepción re.error si ocurre un error al compilar o usar una expresión regular.
Cubriremos dos funciones importantes, que se usarían para manejar expresiones regulares. Sin embargo, una pequeña cosa primero: hay varios caracteres, que tendrían un significado especial cuando se usan en expresiones regulares. Para evitar confusiones al tratar con expresiones regulares, usaríamos Raw Strings comor'expression'.
Patrones básicos que coinciden con caracteres individuales
No Señor. | Expresión y coincidencias |
---|---|
1 | a, X, 9, < los personajes ordinarios simplemente coinciden exactamente entre sí. |
2 | . (a period) coincide con cualquier carácter excepto la nueva línea '\ n' |
3 | \w coincide con un carácter de "palabra": una letra, un dígito o una barra inferior [a-zA-Z0-9_]. |
4 | \W coincide con cualquier carácter que no sea una palabra. |
5 | \b límite entre palabra y no palabra |
6 | \s coincide con un solo carácter de espacio en blanco: espacio, nueva línea, retorno, tabulación |
7 | \S coincide con cualquier carácter que no sea un espacio en blanco. |
8 | \t, \n, \r pestaña, nueva línea, volver |
9 | \d dígito decimal [0-9] |
10 | ^ coincide con el comienzo de la cadena |
11 | $ coincidir con el final de la cadena |
12 | \ inhibir la "especialidad" de un personaje. |
Banderas de compilación
Los indicadores de compilación le permiten modificar algunos aspectos de cómo funcionan las expresiones regulares. Las banderas están disponibles en el módulo re con dos nombres, un nombre largo comoIGNORECASE y un formulario corto de una letra como I.
No Señor. | Bandera y significado |
---|---|
1 | ASCII, A Hace que varios escapes como \ w, \ b, \ sy \ d coincidan solo en caracteres ASCII con la propiedad respectiva. |
2 | DOTALL, S Crea, combina cualquier personaje, incluidas las nuevas líneas |
3 | IGNORECASE, I Hacer coincidencias que no distingan entre mayúsculas y minúsculas |
4 | LOCALE, L Haga una coincidencia con reconocimiento de configuración regional |
5 | MULTILINE, M Coincidencia de varias líneas, que afecta a ^ y $ |
6 | VERBOSE, X (for ‘extended’) Habilite RE detallados, que se pueden organizar de manera más limpia y comprensible |
La función de coincidencia
Esta función intenta hacer coincidir el patrón RE con la cadena con banderas opcionales .
Aquí está la sintaxis de esta función:
re.match(pattern, string, flags = 0)
Aquí está la descripción de los parámetros:
No Señor. | Descripción de parámetros |
---|---|
1 | pattern Esta es la expresión regular que debe coincidir. |
2 | string Esta es la cadena, que se buscará para que coincida con el patrón al principio de la cadena. |
3 | flags Puede especificar diferentes banderas usando OR bit a bit (|). Estos son modificadores, que se enumeran en la tabla siguiente. |
La función re.match devuelve unmatch objetar el éxito, Noneen caso de falla. Usamos grupo (num) o grupos () función dematch objeto para obtener una expresión coincidente.
No Señor. | Método y descripción del objeto de coincidencia |
---|---|
1 | group(num = 0) Este método devuelve una coincidencia completa (o un número de subgrupo específico) |
2 | groups() Este método devuelve todos los subgrupos coincidentes en una tupla (vacío si no había ninguno) |
Ejemplo
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print ("matchObj.group() : ", matchObj.group())
print ("matchObj.group(1) : ", matchObj.group(1))
print ("matchObj.group(2) : ", matchObj.group(2))
else:
print ("No match!!")
Cuando se ejecuta el código anterior, produce el siguiente resultado:
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
La función de búsqueda
Esta función busca la primera aparición del patrón RE dentro de una cadena con banderas opcionales .
Aquí está la sintaxis de esta función:
re.search(pattern, string, flags = 0)
Aquí está la descripción de los parámetros:
No Señor. | Descripción de parámetros |
---|---|
1 | pattern Esta es la expresión regular que debe coincidir. |
2 | string Esta es la cadena, que se buscará para que coincida con el patrón en cualquier parte de la cadena. |
3 | flags Puede especificar diferentes banderas usando OR bit a bit (|). Estos son modificadores, que se enumeran en la tabla siguiente. |
La función re.search devuelve unmatch objetar el éxito, noneen caso de falla. Usamos grupo (num) o grupos () función dematch objeto para obtener la expresión coincidente.
No Señor. | Método y descripción del objeto de coincidencia |
---|---|
1 | group(num = 0) Este método devuelve una coincidencia completa (o un número de subgrupo específico) |
2 | groups() Este método devuelve todos los subgrupos coincidentes en una tupla (vacío si no había ninguno) |
Ejemplo
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs";
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
print ("searchObj.group() : ", searchObj.group())
print ("searchObj.group(1) : ", searchObj.group(1))
print ("searchObj.group(2) : ", searchObj.group(2))
else:
print ("Nothing found!!")
Cuando se ejecuta el código anterior, produce el siguiente resultado:
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
Coincidencia versus búsqueda
Python ofrece dos operaciones primitivas diferentes basadas en expresiones regulares: match busca una coincidencia solo al principio de la cadena, mientras que search busca una coincidencia en cualquier parte de la cadena (esto es lo que hace Perl por defecto).
Ejemplo
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs";
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
print ("match --> matchObj.group() : ", matchObj.group())
else:
print ("No match!!")
searchObj = re.search( r'dogs', line, re.M|re.I)
if searchObj:
print ("search --> searchObj.group() : ", searchObj.group())
else:
print ("Nothing found!!")
Cuando se ejecuta el código anterior, produce el siguiente resultado:
No match!!
search --> matchObj.group() : dogs
Buscar y reemplazar
Uno de los mas importantes re Los métodos que usan expresiones regulares son sub.
Sintaxis
re.sub(pattern, repl, string, max=0)
Este método reemplaza todas las apariciones del patrón RE en la cadena con repl , sustituyendo todas las apariciones a menos que se proporcione max . Este método devuelve una cadena modificada.
Ejemplo
#!/usr/bin/python3
import re
phone = "2004-959-559 # This is Phone Number"
# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print ("Phone Num : ", num)
# Remove anything other than digits
num = re.sub(r'\D', "", phone)
print ("Phone Num : ", num)
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Phone Num : 2004-959-559
Phone Num : 2004959559
Modificadores de expresiones regulares: banderas de opciones
Los literales de expresión regular pueden incluir un modificador opcional para controlar varios aspectos de la coincidencia. Los modificadores se especifican como una bandera opcional. Puede proporcionar varios modificadores utilizando OR exclusivo (|), como se mostró anteriormente y puede estar representado por uno de estos:
No Señor. | Modificador y descripción |
---|---|
1 | re.I Realiza una coincidencia que no distingue entre mayúsculas y minúsculas. |
2 | re.L Interpreta palabras de acuerdo con la ubicación actual. Esta interpretación afecta al grupo alfabético (\ w y \ W), así como al comportamiento de los límites de las palabras (\ by \ B). |
3 | re.M Hace que $ coincida con el final de una línea (no solo el final de la cadena) y hace que ^ coincida con el comienzo de cualquier línea (no solo el comienzo de la cadena). |
4 | re.S Hace que un punto (punto) coincida con cualquier carácter, incluido un salto de línea. |
5 | re.U Interpreta letras según el juego de caracteres Unicode. Esta bandera afecta el comportamiento de \ w, \ W, \ b, \ B. |
6 | re.X Permite una sintaxis de expresión regular "más linda". Ignora los espacios en blanco (excepto dentro de un conjunto [] o cuando se escapa por una barra invertida) y trata el # sin escape como un marcador de comentario. |
Patrones de expresión regular
Excepto por los personajes de control, (+ ? . * ^ $ ( ) [ ] { } | \), todos los personajes coinciden. Puede escapar de un carácter de control precediéndolo con una barra invertida.
La siguiente tabla enumera la sintaxis de expresiones regulares que está disponible en Python:
No Señor. | Descripción de parámetros |
---|---|
1 | ^ Coincide con el comienzo de la línea. |
2 | $ Coincide con el final de la línea. |
3 | . Coincide con cualquier carácter, excepto la nueva línea. El uso de la opción m también le permite hacer coincidir la nueva línea. |
4 | [...] Coincide con cualquier carácter individual entre paréntesis. |
5 | [^...] Coincide con cualquier carácter individual que no esté entre corchetes |
6 | re* Coincide con 0 o más apariciones de la expresión anterior. |
7 | re+ Coincide con 1 o más ocurrencias de la expresión anterior. |
8 | re? Coincide con 0 o 1 aparición de la expresión anterior. |
9 | re{ n} Coincide exactamente con n número de apariciones de la expresión anterior. |
10 | re{ n,} Coincide con no más apariciones de la expresión anterior. |
11 | re{ n, m} Coincide con al menos n y como máximo m apariciones de la expresión anterior. |
12 | a|b Coincide con a o b. |
13 | (re) Agrupa expresiones regulares y recuerda texto coincidente. |
14 | (?imx) Alterna temporalmente entre las opciones i, m o x dentro de una expresión regular. Si está entre paréntesis, solo esa área se ve afectada. |
15 | (?-imx) Desactiva temporalmente las opciones i, m o x dentro de una expresión regular. Si está entre paréntesis, solo esa área se ve afectada. |
dieciséis | (?: re) Agrupa expresiones regulares sin recordar el texto coincidente. |
17 | (?imx: re) Cambia temporalmente las opciones i, m o x entre paréntesis. |
18 | (?-imx: re) Desactiva temporalmente las opciones i, m o x entre paréntesis. |
19 | (?#...) Comentario. |
20 | (?= re) Especifica la posición mediante un patrón. No tiene rango. |
21 | (?! re) Especifica la posición mediante la negación del patrón. No tiene rango. |
22 | (?> re) Coincide con el patrón independiente sin retroceso. |
23 | \w Coincide con caracteres de palabra. |
24 | \W Coincide con caracteres que no son palabras. |
25 | \s Coincide con los espacios en blanco. Equivalente a [\ t \ n \ r \ f]. |
26 | \S Coincide con espacios que no son en blanco. |
27 | \d Coincide con dígitos. Equivalente a [0-9]. |
28 | \D Coincide con no dígitos. |
29 | \A Coincide con el comienzo de la cadena. |
30 | \Z Coincide con el final de la cuerda. Si existe una nueva línea, coincide justo antes de la nueva línea. |
31 | \z Coincide con el final de la cuerda. |
32 | \G Los partidos apuntan donde terminó el último partido. |
33 | \b Coincide con los límites de las palabras cuando están fuera de los corchetes. Coincide con el retroceso (0x08) cuando está dentro de los corchetes. |
34 | \B Coincide con los límites que no son palabras. |
35 | \n, \t, etc. Coincide con nuevas líneas, retornos de carro, pestañas, etc. |
36 | \1...\9 Coincide con la enésima subexpresión agrupada. |
37 | \10 Coincide con la enésima subexpresión agrupada si ya coincidió. De lo contrario, se refiere a la representación octal de un código de carácter. |
Ejemplos de expresiones regulares
Caracteres literales
No Señor. | Ejemplo y descripción |
---|---|
1 | python Coincide con "pitón". |
Clases de personajes
No Señor. | Ejemplo y descripción |
---|---|
1 | [Pp]ython Coincidir con "Python" o "python" |
2 | rub[ye] Coincidir con "ruby" o "rube" |
3 | [aeiou] Coincidir con cualquier vocal minúscula |
4 | [0-9] Coincidir con cualquier dígito; igual que [0123456789] |
5 | [a-z] Coincidir con cualquier letra ASCII minúscula |
6 | [A-Z] Coincide con cualquier letra ASCII mayúscula |
7 | [a-zA-Z0-9] Coincide con cualquiera de los anteriores |
8 | [^aeiou] Coincidir con cualquier cosa que no sea una vocal minúscula |
9 | [^0-9] Coincide con cualquier cosa que no sea un dígito |
Clases de personajes especiales
No Señor. | Ejemplo y descripción |
---|---|
1 | . Coincidir con cualquier carácter excepto nueva línea |
2 | \d Coincide con un dígito: [0-9] |
3 | \D Coincidir con un no dígito: [^ 0-9] |
4 | \s Coincide con un carácter de espacio en blanco: [\ t \ r \ n \ f] |
5 | \S Coincidir con espacios que no son en blanco: [^ \ t \ r \ n \ f] |
6 | \w Coincide con un carácter de una sola palabra: [A-Za-z0-9_] |
7 | \W Coincide con un carácter que no es una palabra: [^ A-Za-z0-9_] |
Casos de repetición
No Señor. | Ejemplo y descripción |
---|---|
1 | ruby? Coincidir con "rub" o "ruby": la y es opcional |
2 | ruby* Coincide con "frotar" más 0 o más ys |
3 | ruby+ Coincide con "frotar" más 1 o más ys |
4 | \d{3} Coincidir exactamente con 3 dígitos |
5 | \d{3,} Coincide con 3 o más dígitos |
6 | \d{3,5} Coincide con 3, 4 o 5 dígitos |
Repetición no maligna
Esto coincide con el menor número de repeticiones:
No Señor. | Ejemplo y descripción |
---|---|
1 | <.*> Repetición codiciosa: coincide con "<python> perl>" |
2 | <.*?> Nongreedy: coincide con "<python>" en "<python> perl>" |
Agrupar con paréntesis
No Señor. | Ejemplo y descripción |
---|---|
1 | \D\d+ Sin grupo: + repeticiones \ d |
2 | (\D\d)+ Agrupados: + repeticiones \ D \ d par |
3 | ([Pp]ython(,)?)+ Coincidir con "Python", "Python, python, python", etc. |
Referencias anteriores
Esto vuelve a coincidir con un grupo previamente emparejado:
No Señor. | Ejemplo y descripción |
---|---|
1 | ([Pp])ython&\1ails Coincidir con Python y cubos o Python y cubos |
2 | (['"])[^\1]*\1 Cadena de comillas simples o dobles. \ 1 coincide con lo que coincida con el primer grupo. \ 2 coincide con lo que coincida con el segundo grupo, etc. |
Alternativas
No Señor. | Ejemplo y descripción |
---|---|
1 | python|perl Coincidir con "python" o "perl" |
2 | rub(y|le) Coincidir con "rubí" o "rublo" |
3 | Python(!+|\?) "Python" seguido de uno o más. o uno ? |
Anclas
Esto debe especificar la posición de coincidencia.
No Señor. | Ejemplo y descripción |
---|---|
1 | ^Python Coincide con "Python" al comienzo de una cadena o línea interna |
2 | Python$ Coincide con "Python" al final de una cadena o línea |
3 | \APython Coincide con "Python" al comienzo de una cadena |
4 | Python\Z Coincide con "Python" al final de una cadena |
5 | \bPython\b Coincidir con "Python" en el límite de una palabra |
6 | \brub\B \ B es un límite sin palabras: coincide con "rub" en "rube" y "ruby" pero no solo |
7 | Python(?=!) Coincide con "Python", si va seguido de un signo de exclamación. |
8 | Python(?!!) Coincide con "Python", si no va seguido de un signo de exclamación. |
Sintaxis especial con paréntesis
No Señor. | Ejemplo y descripción |
---|---|
1 | R(?#comment) Coincide con "R". Todo lo demás es un comentario. |
2 | R(?i)uby No distingue entre mayúsculas y minúsculas al coincidir con "uby" |
3 | R(?i:uby) Lo mismo que arriba |
4 | rub(?:y|le)) Agrupar solo sin crear \ 1 referencia inversa |