Expresiones regulares compiladas de expresiones regulares de Python (2)

declaración

Python proporciona un módulo de interfaz nuevo motor de expresiones regulares , mientras que lo que le permite la expresión regular compilada en un modelo de objetos , y utilizarlos para que coincida .

Nota: El
módulo re está escrito en lenguaje C , por lo que la eficiencia es mucho mayor que con los métodos de cadena ordinarios ; compilar expresiones regulares también es para mejorar aún más la eficiencia ; a menudo nos referiremos a los "modos" más adelante . Se refiere al objeto de patrón que la expresión regular se compila en .

Compilar expresión regular

Las expresiones regulares se compilan en objetos de patrón , que tienen varios métodos para manipular cadenas , como buscar coincidencias de patrones o realizar el reemplazo de cadenas .

import re
p = re.compile('ab*')

Inserte la descripción de la imagen aquí
re.compile()También puede aceptar flagsparámetros utilizados para abrir varias funciones especiales y variaciones de sintaxis ,

>>> p = re.compile('ab*', re.IGNORECASE)

La expresión regular se pasa como un parámetro de cadenare.compile() . Debido a que la expresión regular no es una Pythonparte central de y, por lo tanto, no proporciona soporte de sintaxis especial para ella, la expresión regular solo puede ser una representación de cadena . (Algunas aplicaciones no necesitan usar expresiones regulares en absoluto, por lo que los amigos de la comunidad de Python piensan que no es necesario incorporarlas al núcleo de Python). Por el contrario, el módulo re solo se incluye en Python como una extensión módulo de C , al igual que el módulo socket y el módulo zlib .

Barra invertida problemática

Las expresiones regulares usan '\'carácter para hacer algunos caracteres comunes con habilidades especiales (por ejemplo, \dsignifica coincidir con cualquier dígito decimal), o privados de la habilidad de algunos caracteres especiales (por ejemplo, \[indica un corchete izquierdo de coincidencia '['). Esto seguirá Pythonuna cadena de caracteres para lograr la misma funcionalidad del conflicto.

Si necesita LaTeXutilizar un archivo en una cadena de coincidencia de expresión regular'\section' . Debido a que la barra invertida es un carácter especial que debe coincidir , debe agregar una barra invertida antes para privarla de su función especial. Entonces escribiremos los caracteres de la expresión regular como'\\section'

Python también usa barras invertidas en cadenas para expresar un significado especial . Entonces, si queremos '\\section'completar el pase re.compile(), necesitamos agregar dos barras invertidas nuevamente ...

Coincidir con personajes Fase de emparejamiento
\section La cuerda a combinar
\\section Las expresiones regulares '\\'representan la coincidencia de caracteres'\'
"\\\\section" Desafortunadamente, las cadenas de Python también pueden usar '\\'representar caracteres'\'

En resumen, para hacer coincidir el carácter de barra invertida, necesitamos usar cuatro barras invertidas en la cadena . Por lo tanto, el uso frecuente de barras invertidas en expresiones regulares provocará una tormenta de barras invertidas, lo que a su vez hará que la cadena sea extremadamente difícil de entender.

La solución es usar la cadena original de Python para representar la expresión regular (es decir, agregue r delante de la cadena, recuerde ...):

Cuerda regular Cuerda cruda
"ab*" r"ab*"
"\\\\section" r"\\section"
"\\w+\\s+\\1" r"\w+\s+\1"

Se recomienda utilizar cadenas sin formato para expresar expresiones regulares .

Logra emparejar

Cuando compila la expresión regular, obtiene un objeto patrón . ¿Qué puedes hacer con él? El objeto patrón tiene muchos métodos y propiedades . Vamos a enumerar los más importantes a continuación:

método Características
match() Determinar si una expresión regular coincide con una cadena desde el principio
search() Atraviese la cadena y encuentre la primera posición que coincida con la expresión regular
findall() Atraviese la cadena, busque todas las posiciones que coincidan con la expresión regular y devuélvala en forma de lista
finditer() Atraviese la cadena, busque todas las posiciones que coincidan con la expresión regular y devuélvala en forma de iterador

Si no se encuentra ninguna coincidencia, entonces, match()y search()volverá None; si la coincidencia es exitosa, devuelve un objeto coincidente (objeto coincidente), contiene toda la información que coincide: por ejemplo, dónde empezar, dónde terminar, subcadena coincidente, etc. .

match()

A continuación, te explicamos paso a paso:

>>> import re
>>> p = re.compile('[a-z]+')
>>> p
re.compile('[a-z]+')

Captura de pantalla de implementación:
Inserte la descripción de la imagen aquí

Ahora, puede intentar usar la expresión regular [a-z]+ para hacer coincidir varias cadenas.
P.ej:

>>> p.match("")
>>> print(p.match(""))
None

Captura de pantalla de implementación:
Inserte la descripción de la imagen aquí

Debido a que +indica una coincidencia una o más veces , no puede ser la coincidencia de cadena vacía. Por tanto, match()vuelve None.

Probemos con otra cadena que pueda coincidir:

>>> m = p.match('fish')
>>> m  
<_sre.SRE_Match object; span=(0, 4), match='fish'>

Captura de pantalla de implementación:
Inserte la descripción de la imagen aquí

En este ejemplo, sematch() devuelve un objeto coincidente y lo almacenamos en la variable m para uso futuro.

A continuación, echemos un vistazo a la información que se encuentra en el objeto coincidente. El objeto coincidente contiene muchos métodos y propiedades , los siguientes son los más importantes:

método Características
group() Devuelve la cadena coincidente
start() Devuelve la posición inicial del partido.
end() Devuelve la posición final del partido
span() Devuelve una tupla que representa la posición coincidente (inicio, final)
>>> m.group()
'fish'
>>> m.start()
0
>>> m.end()
4
>>> m.span()
(0, 4)

Captura de pantalla de implementación:
Inserte la descripción de la imagen aquí

Dado que match()solo la comprobación coincide con la expresión regular al comienzo de la cadena , start () siempre devuelve 0.

search()

Sin embargo, el método search () es diferente:

>>> print(p.match('^_^fish'))
None
>>> m = p.search('^_^fish')
>>> print(m)
<_sre.SRE_Match object; span=(3, 7), match='fish'>
>>> m.group()
'fish'
>>> m.span()
(3, 7)
>>> m=p.search('^_^f123i54sh')
>>> m
<re.Match object; span=(3, 4), match='f'>

Captura de pantalla de implementación:
Inserte la descripción de la imagen aquí

En aplicaciones prácticas, la forma más común es almacenar el objeto coincidente en una variable local y verificar si el valor de retorno es Ninguno.

El formulario suele ser el siguiente:

p = re.compile( ... )
m = p.match( 'string goes here' )
if m:
    print('Match found: ', m.group())
else:
    print('No match')

Hay dos métodos para devolver todos los resultados coincidentes, uno es findall()y el otro es finditer().

findall()

findall() Lo que se devuelve es una lista:

>>> p = re.compile('\d+')
>>> p.findall('3只小狗,15条腿,多出的3条在哪里?')
['3', '15', '3']

Captura de pantalla de implementación:
Inserte la descripción de la imagen aquí

finditer()

findall()Necesitamos crear una lista antes de regresar, y el finditer()objeto coincidente succionado devuelto como un iterador:

>>> iterator = p.finditer('3只小狗,15条腿,多出的3条在哪里?')
>>> iterator
<callable_iterator object at 0x00000212CE96ADC8>
>>> for match in iterator:
        print(match.span())
        
(0, 1)
(5, 7)
(13, 14)

Captura de pantalla de implementación:
Inserte la descripción de la imagen aquí

Si la lista es grande, es mucho más eficiente devolver el iterador

Supongo que te gusta

Origin blog.csdn.net/CSNN2019/article/details/114465950
Recomendado
Clasificación