Tutorial de la serie avanzada de Python: Sintaxis avanzada de Python y expresiones regulares

objetivo de aprendizaje

1. Ser capaz de dominar el uso de la sentencia with

2. Ser capaz de conocer los dos métodos de creación del generador.

3. Conoce la diferencia entre copia profunda y copia superficial

4. Capaz de dominar la escritura de expresiones regulares en Python

1. Sintaxis avanzada de Python

1. con declaración y administrador de contexto

☆ con declaración

Python proporciona una declaración with, que es simple y segura. Cuando se usa la declaración with, la operación de archivo se puede llamar automáticamente para cerrar la operación de archivo, incluso si ocurre una excepción, la operación de archivo se cerrará automáticamente. Toma una castaña:

Utilice el método with para implementar operaciones con archivos, de la siguiente manera:

 
 
 
 

# 1. Abra el archivo escribiendo
withopen('1.txt','w') como f:
# 2. Lea el contenido del archivo
f.write('hello world')

2. Cómo se crea el generador

Un generador de Python es un tipo especial de iterador que genera valores a pedido, en lugar de todos a la vez. Los generadores ahorran espacio en la memoria y pueden generar datos de manera perezosa, solo generando datos cuando es necesario.

Cómo crear un generador

① Derivación del generador

② palabra clave de rendimiento

☆ Comprensión del generador

Las expresiones generadoras son una sintaxis similar a la comprensión de listas que se puede usar para crear objetos generadores. A diferencia de las listas de comprensión, las expresiones generadoras usan paréntesis en lugar de corchetes y devuelven un objeto generador en lugar de una lista.

El siguiente es un ejemplo de una expresión generadora:

 
 
 
 

# Crear un generador
my_generator =(i *2for i inrange(5))
print(my_generator)

# luego obtener el siguiente valor del generador
# value = next(my_generator)
# print(value)

# recorrer el generador
para el valor en my_generator:
imprimir (valor)

Cuando se usa next para obtener el siguiente valor del generador, es decir:

 
 
 
 

# Crear un generador
my_generator = (i * 2 for i in range(5))
print(my_generator)

# luego obtener el siguiente valor del generador
value = next(my_generator)
print(value)

Este código usa una expresión generadora para crear un objeto generador my_generator que genera números enteros del 0 al 4, multiplicando cada número entero por 2.

A continuación, utilice la siguiente función para obtener el siguiente valor del objeto generador y asígnelo al valor de la variable. Dado que los generadores generan valores a pedido, la primera vez que se llama a la siguiente función, el generador genera el primer valor y devuelve ese valor. La próxima vez que se llama a la siguiente función, el generador genera el siguiente valor y devuelve ese valor. Por analogía, hasta que no haya más valores para generar en el generador, volver a llamar a la siguiente función arrojará una excepción StopIteration, lo que indica que el generador no tiene más valores para generar.

En este ejemplo, la primera vez que se llama a la siguiente función, el generador genera el primer valor 0 y devuelve ese valor. Por lo tanto, el valor del valor de la variable es 0, que luego se imprime.

 
 
 
 

# Crear un generador
my_generator = (i * 2 for i in range(5))
print(my_generator)

# Recorrer el generador
por valor en my_generator:
print(value)

Este código usa una expresión generadora para crear un objeto generador my_generator que genera números enteros del 0 al 4, multiplicando cada número entero por 2.

A continuación, utilice un ciclo for para iterar a través del objeto generador, tomando cada valor devuelto por el generador e imprimiéndolo. Dado que el generador genera valores a pedido, el siguiente valor se genera en cada iteración, por lo que al atravesar el generador, no se generan todos los valores a la vez, sino solo cuando se necesitan. En este ejemplo, durante el ciclo, el generador generará cinco valores de 0, 2, 4, 6 y 8 en secuencia, asignará estos valores al valor de la variable y luego los imprimirá. El ciclo termina cuando no hay más valores en el generador para generar. Debido a que los generadores generan valores a pedido, ahorran espacio en la memoria y pueden generar datos de manera perezosa, solo generando datos cuando se necesitan.

Funciones relacionadas con el generador:

 
 
 
 

La siguiente función obtiene el siguiente valor en el generador
para bucles a través de cada valor en el generador

☆ generador de rendimiento

Características del generador de palabras clave de rendimiento: tenga la palabra clave de rendimiento en la función de definición

 
 
 
 

defgenerator(n):
for i inrange(n):
print('empezar a generar...')
yield i
print('terminar una vez...')

g = generador(5)
print(siguiente(g))
print(siguiente (g))
print(siguiente(g))
print(siguiente(g))
print(siguiente(g))-----> normal
print(siguiente(g))-----> error
Rastreo (más reciente última llamada):
Archivo "/Users/cndws/PycharmProjects/pythonProject/demo.py", línea 14, en <módulo>
print(next(g))
StopIteration

Este código define una función generadora denominada generador, cuyo parámetro n representa el número de datos generados. Dentro de la función, se usa un ciclo for para generar n números, y cada vez que se genera un número, se usa la instrucción yield para devolver el número como el valor del generador, y el generador comienza a generar... y se completa una vez ... , para distinguir en qué etapa se generó la salida del generador. La declaración de rendimiento suspenderá la ejecución de la función y devolverá el valor devuelto como el valor del generador. La próxima vez que se llame al método next(), la ejecución continuará desde la declaración de rendimiento.

En el programa, primero llame al generador(5) para crear un generador g, luego llame al método next(g) 5 veces seguidas para obtener el siguiente valor del generador, y cada vez que se llame al método next(), el generador generará el siguiente valor y devolverá ese valor. Debido a que hay 5 números para generar en el generador, normalmente se pueden obtener 5 valores e imprimirlos. Cuando el programa llama al método next() por sexta vez, dado que no hay más valores para generar en el generador, se lanzará una excepción StopIteration, lo que indica que el generador no tiene más valores para generar. Este es un comportamiento predeterminado del generador. Cuando no se puedan generar más valores, se lanzará una excepción StopIteration, que se puede capturar en el programa y procesar en consecuencia.

 
 
 
 

defgenerator(n):
for i inrange(n):
print('empezar a generar...')
yield i
print('terminar una vez...')

g = generador(5)
for i in g:
print(i)

Este fragmento de código es similar al fragmento de código anterior y también define un generador de funciones generador para generar n números. La diferencia es que aquí se usa un bucle for para atravesar el objeto generador g en lugar de llamar continuamente al método next() para obtener el siguiente valor del generador. En el ciclo for, cada iteración llamará automáticamente al método next() para obtener el siguiente valor del generador, y asignará este valor a la variable de ciclo i, y luego ejecutará el bloque de código en el cuerpo del ciclo. En este ejemplo, solo hay una línea de código en el cuerpo del bucle, que imprime el valor de la variable de bucle i.

resultado de la operación:

 
 
 
 

Empezar a construir...
0
Terminar una vez...
Empezar a construir...
1
Terminar una vez...
Empezar a construir...
2
Terminar una vez...
Empezar a construir...
3
Terminar una vez...
Empezar a construir...
4
hecho una vez...

el proceso terminó con el código de salida 0

Debido a que generator(5) devuelve un objeto generador, se puede usar directamente en un bucle for para recorrer todos los valores en el objeto generador. En cada bucle, el generador genera el siguiente valor, asigna ese valor a la variable de bucle i y lo imprime. Dado que el generador genera valores bajo demanda, en el proceso de bucle, cada vez que se genera un valor, se imprimirá una línea para comenzar a generar... y terminar una vez..., para distinguir en qué etapa la salida de el generador se genera de. Eventualmente, después de que finaliza el ciclo, no hay más valores en el generador para generar y el programa finaliza.

 
 
 
 

defgenerator(n):
for i inrange(n):
print('empezar a generar...')
yield i
print('terminar una vez...')

g = generador(5)
whileTrue:
try:
print(siguiente(g) )
excepto StopIteration:
break

Este fragmento de código es similar a los dos fragmentos de código anteriores y también define un generador de funciones generador para generar n números. La diferencia es que aquí se usa un ciclo while y una sentencia try...except para obtener el siguiente valor del generador. En el ciclo while, cada ciclo llamará al método next() para obtener el siguiente valor del generador e imprimir el valor. Dado que el generador genera valores bajo demanda, en el proceso de bucle, cada vez que se genera un valor, se imprimirá una línea para comenzar a generar... y terminar una vez..., para distinguir en qué etapa la salida de el generador se genera de. En la declaración try...except, si el generador no tiene más valores para generar, arrojará una excepción StopIteration y luego usará la declaración break para salir del bucle.

Debido a que el generador genera valores a pedido, use el ciclo while y la declaración try...except para obtener el siguiente valor del generador, que puede detectar la excepción a tiempo y salir del ciclo cuando no haya más valores. a generar en el generador, para evitar situaciones anómalas en el programa. Este método es más flexible y la salida del generador se puede controlar libremente según las necesidades, y también se puede tratar a tiempo cuando hay una situación anormal en el generador.

punto importante:

① La ejecución del código se detendrá hasta el rendimiento, y luego devolverá el resultado, y la próxima vez que se inicie el generador, continuará ejecutándose en la posición de pausa

② Si el generador completa la generación de datos y vuelve a obtener los siguientes datos en el generador, se lanzará una excepción StopIteration, lo que indica que la iteración se detuvo

③ La operación de excepción no se maneja dentro del ciclo while, y debe agregarse manualmente para manejar la operación de excepción

④ El ciclo for maneja automáticamente la excepción de parada de iteración, que es más conveniente de usar y se recomienda que todos la usen.

☆ palabra clave de rendimiento y palabra clave de retorno

Si no entiende muy bien el rendimiento, primero puede considerar el rendimiento como un hermano del retorno.Todos se usan en funciones y cumplen la función de devolver algún tipo de resultado.

La diferencia entre los dos es:

La función con retorno devuelve directamente todos los resultados, el programa termina y ya no se ejecuta, y destruye las variables locales;

 
 
 
 

defexample():
x =1
return x

ejemplo = ejemplo()
print(ejemplo)

La función con rendimiento devuelve un objeto generador iterable (generador), puede usar el bucle for o llamar al método next() para atravesar el objeto generador y extraer los resultados.

 
 
 
 

defexample():
x =1
y =10
while x < y:
yield x
x +=1

ejemplo = ejemplo()
print(ejemplo)

☆ ¿Por qué usar el generador de rendimiento?

 
 
 
 

import memory_profiler as mem


# nums = [1, 2, 3, 4, 5]
# print([i*i for i in nums])


nums =list(range(10000000))
print('Memoria antes de la operación:', mem .memory_usage())
# list
# square_nums = [n * n para n en números]
# generador
square_nums = (n * n para n en números)
print('Memoria después de la operación:', mem.memory_usage())

Este código usa el módulo memory_profiler para probar el uso de memoria del programa.

Primero importe el módulo memory_profiler y luego defina una lista de números que contenga 10000000 números. Luego, se emite el uso de la memoria antes de la operación. Luego, use una expresión generadora n * n para n en números para generar una nueva secuencia números_cuadrados, que contiene el cuadrado de cada elemento en números. Una expresión generadora es un generador cuya sintaxis es similar a una lista por comprensión. La diferencia es que utiliza paréntesis en lugar de corchetes para producir un objeto generador en lugar de una lista. Las expresiones del generador son elementos, se calculan solo cuando es necesario, en lugar de calcular todos los elementos a la vez y almacenarlos en la memoria.

Finalmente, el programa muestra el uso de la memoria después de la operación.

Después de ejecutar el código, puede ver que el uso de memoria del programa no cambia significativamente después de ejecutar la expresión del generador. Esto se debe a que las expresiones generadoras generan elementos a pedido y no calculan ni almacenan todos los elementos por adelantado. A diferencia del uso de comprensiones de lista, el uso de expresiones generadoras puede reducir la huella de memoria del programa al tiempo que garantiza la funcionalidad del programa.

☆ rendimiento y secuencia de Fibonacci

Hay una secuencia de Fibonacci famosa en matemáticas (Fibonacci)

Requisitos: el primer número de la secuencia es 0, el segundo número es 1 y cada número subsiguiente se puede obtener sumando los dos primeros números:

Ejemplo: 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

Ahora usamos un generador para implementar esta secuencia de Fibonacci. Cada vez que se toma un valor, se usa un algoritmo para generar los siguientes datos. El generador solo genera un dato por llamada, lo que puede ahorrar mucha memoria.

 
 
 
 

deffib(max):
n, a, b =0,0,1
while n <max:
yield b # 使用 yield
# print b
a, b = b, a + b
n = n +1

para n en fib(5) :
imprimir n

Este código utiliza una función generadora para generar los números de Fibonacci y un ciclo for para generar los primeros 5 números de la serie.

Primero observe la definición de la función generadora fib. Esta función acepta un parámetro max, indicando el mayor número de la secuencia a generar. Dentro de la función se definen tres variables n, a y b, que representan el número de secuencia del número generado actualmente, el número anterior y el número actual en la secuencia respectivamente. Los valores iniciales son 0, 0 y 1 respectivamente. Luego ingrese un bucle, cada bucle usa la declaración de rendimiento para devolver el número b en la matriz actual, y luego actualiza los valores de las variables a y b para calcular el siguiente número, y agrega 1 al valor de n. Este bucle se ejecutará hasta que el valor de n alcance el máximo.

El siguiente es el código que usa un bucle for para generar los primeros 5 números en la secuencia. Primero use fib(5) para llamar a la función generadora fib para obtener un objeto generador. Luego pase este objeto generador al ciclo for, y el ciclo usará la siguiente función para obtener el siguiente número en el generador uno por uno hasta que se repita 5 veces. En cada ciclo, use la función de impresión para generar el número n en la matriz actual. Dado que la declaración de rendimiento se usa en la función del generador, este bucle generará los primeros 5 números de la secuencia, a saber, 1, 1, 2, 3 y 5, uno por uno.

Debe tenerse en cuenta que esta función generadora puede generar una secuencia infinitamente, por lo que al usar un bucle for para generar una secuencia, debe especificar el número de bucles o terminar manualmente el bucle. Además, dado que esta función generadora usa la instrucción yield, solo se generará un número en cada bucle, en lugar de todos los números de la matriz a la vez, lo que ahorra memoria.

3. Copia profunda y superficial

☆ varios conceptos

  • Variable: es un elemento de una tabla de sistema que tiene un espacio de conexión que apunta a un objeto

  • Objeto: un bloque de memoria que se asigna para almacenar el valor que representa

  • Referencia: es un puntero formado automáticamente de una variable a un objeto

  • Tipo: pertenece al objeto, no a la variable

  • Objetos inmutables: objetos que no se pueden modificar una vez creados, incluidos tipos numéricos, cadenas, tipos booleanos y tuplas

(El valor en la memoria al que apunta el objeto no se puede cambiar. Al cambiar una variable, dado que el valor al que apunta no se puede cambiar, es equivalente a copiar el valor original y luego cambiarlo, lo que abrirá una nueva dirección y la variable apunta a esta nueva dirección).

  • Objetos mutables: objetos que se pueden modificar, incluidas listas, diccionarios y colecciones.

(El valor en la memoria al que apunta el objeto se puede cambiar. Después de que se cambia la variable (hablando con precisión, una referencia), el valor al que apunta se cambia directamente, y no se produce ningún comportamiento de copia, y no se abre una nueva dirección En términos sencillos, es un cambio en el lugar.) Cuando escribimos:

 
 
 
 

un = "pitón"

Lo que hace el intérprete de Python:

① Crear variable a

② Cree un objeto (asigne un bloque de memoria) para almacenar el valor 'python'

③ Conecte variables y objetos a través de punteros, y la conexión de variables a objetos se llama referencia (objeto de referencia variable)

imagen-20210121111247319.png

☆ asignación

Asignación: simplemente copie la referencia del nuevo objeto y no abrirá un nuevo espacio de memoria.

No genera un objeto independiente para existir solo, sino que simplemente coloca una nueva etiqueta en el bloque de datos original, por lo que cuando se cambia una de las etiquetas, el bloque de datos cambiará y la otra etiqueta también cambiará en consecuencia.

 

☆ copia superficial

Copia superficial: cree un nuevo objeto cuyo contenido sea una referencia al objeto original.

La razón por la cual la copia superficial se llama copia superficial es que solo copia una capa, el objeto más externo en sí mismo, y los elementos internos son solo una copia de una referencia.

Caso 1: Asignación

 

Caso 2: copia superficial de tipo mutable

 

Caso 3: copia superficial de tipo inmutable

 

Nota: la copia superficial de tipos inmutables no abrirá un nuevo espacio de memoria para el objeto copiado, sino que solo copiará la referencia de este objeto

La copia superficial tiene tres formas: operación de división, función de fábrica (lista()), función de copia en el módulo de copia.

Tales como: lst = [1,2,[3,4]]

Operación de corte: lst1 = lst[:] o lst1 = [cada uno para cada uno en lst]

Nota: [:] es similar a [0:], lo que significa dividir desde el índice 0 hasta el final. Devuelve una nueva lista.

Función de fábrica: lst1 = list(lst)

función de copia: lst1 = copy.copy(lst)

Pero hay una lista anidada[3,4] en lst, si la modificamos, la situación es diferente.

La replicación superficial debe discutirse en dos casos:

1) Cuando el valor de la copia superficial es un objeto inmutable (cadena, tupla, tipo numérico), es lo mismo que en el caso de "asignación", el valor id del objeto_ (se usa la función id() para obtener la dirección de memoria del objeto) y la copia superficial igual que el valor original.

2) Cuando el valor de la copia superficial sea un objeto mutable (lista, diccionario, colección), existirá un "objeto no tan independiente". Hay dos casos:

El primer caso: no hay un subobjeto complejo en el objeto copiado, el cambio del valor original no afectará el valor de la copia superficial y el cambio del valor de la copia superficial no afectará el valor original. El valor de identificación del valor original es diferente del valor original de la copia superficial.

El segundo caso: hay subobjetos complejos en el objeto copiado (por ejemplo, un subelemento en una lista es una lista), si el subobjeto complejo no se cambia, el cambio de valor de la copia superficial no afectará el valor original. Pero cambiar el valor del subobjeto complejo en el valor original afectará el valor superficial copiado.

☆ copia profunda

Copia profunda: correspondiente a la copia superficial, la copia profunda copia todos los elementos del objeto, incluidos los elementos anidados de varios niveles. El objeto que se copia en profundidad es un objeto completamente nuevo que ya no está asociado con el objeto original.

Por lo tanto, cambiar el objeto original copiado no afectará al nuevo objeto que se ha copiado. Solo hay una forma, la función de copia profunda en el módulo de copia.

Copia profunda de tipo mutable:

 

Copia profunda de tipo inmutable: la copia profunda de tipo inmutable no abrirá un nuevo espacio de memoria para el objeto copiado, sino que solo copiará la referencia de este objeto

☆ Presentación de caso

Caso 1: copia profunda para objetos mutables

 
 
 
 

importar copia
a=[1,2,3]

print("=====赋值=====")
b=a
print(a)
print(b)
print(id(a))
print(id(b ))

print("=====浅拷贝=====")
b=copy.copy(a)
print(a)
print(b)
print(id(a))
print(id(b))

print ("=====深拷贝=====")
b=copy.deepcopy(a)
print(a)
print(b)
print(id(a))
print(id(b))

resultado:

 
 
 
 

===== Asignación =====
[1,2,3]
[1,2,3]
37235144
37235144
===== Copia superficial =====
[1,2,3]
[1,2 ,3]
37235144
37191432
===== copia profunda =====
[1,2,3]
[1,2,3]
37235144
37210184

resumen:

Asignación: igual valor, igual dirección

copiar copia superficial: valores iguales, direcciones no iguales

copia profunda copia profunda: el valor es igual, la dirección no es igual

Caso 2: copia profunda y superficial para objetos mutables (la capa exterior cambia elementos)

 
 
 
 

importar copia
l=[1,2,3,[4,5]]

l1=l #asignación
l2=copia.copia(l)#copia superficial
l3=copia.copiaprofunda(l)#copia profunda
l.append(6)

imprimir (l)
imprimir (l1)
imprimir (l2)
imprimir (l3)

resultado:

 
 
 
 

[1,2,3,[4,5],6]#l agrego un elemento 6
[1,2,3,[4,5],6]#l1 luego agrego un elemento 6
[1,2,3, [4,5]]#l2 permanece sin cambios
[1,2,3,[4,5]]#l3 permanece sin cambios

Caso 3: copia profunda y superficial para objetos mutables (la capa interna cambia elementos)

 
 
 
 

importar copia
l=[1,2,3,[4,5]]

l1=l #asignación
l2=copia.copia(l)#copia superficial
l3=copia.copiaprofunda(l)#copia profunda
l[3].append (6)

imprimir (l)
imprimir (l1)
imprimir (l2)
imprimir (l3)

resultado:

 
 
 
 

[1,2,3,[4,5,6]]#l[3] agregar un elemento 6
[1,2,3,[4,5,6]]#l1 luego agregar un elemento 6
[1,2 ,3,[4,5,6]]#l2 seguido de la adición de un elemento 6
[1,2,3,[4,5]]#l3 permanece sin cambios

resumen:

① Cuando la capa externa agregue elementos, la copia superficial no cambiará con la lista original; cuando la capa interna agregue elementos, la copia superficial cambiará.

② No importa cómo cambie la lista original, la copia profunda permanece sin cambios.

③ El objeto de asignación cambia junto con la lista original.

2. Descripción general de las expresiones regulares

1. Por qué aprender expresiones regulares

En el proceso de desarrollo real, a menudo existe la necesidad de encontrar cadenas que cumplan con ciertas reglas complejas, como: dirección de correo electrónico, dirección de imagen, número de teléfono móvil, etc. En este momento, si desea hacer coincidir o encontrar cadenas que cumplan con ciertas reglas, puede usar expresiones regulares

imagen-20210118135358176.png

En el proceso de aplicación práctica, puede desempeñar un papel importante en el procesamiento de textos, análisis de datos, rastreadores web, limpieza de datos y otros campos. Aquí hay algunas razones para aprender expresiones regulares:

  • Procesamiento de texto: en el procesamiento de texto, necesitamos realizar operaciones como buscar, reemplazar y dividir texto, y las expresiones regulares pueden ayudarnos a completar estas tareas de manera rápida y precisa. Por ejemplo, podemos usar expresiones regulares para buscar texto que contenga una palabra o frase específica, o para reemplazar algunos caracteres en un fragmento de texto con otros caracteres. 

  • Análisis de datos: en el análisis de datos, necesitamos realizar operaciones como limpiar, extraer y convertir datos, y las expresiones regulares pueden ayudarnos a completar estas tareas de manera rápida y eficiente. Por ejemplo, podemos usar expresiones regulares para extraer números, fechas, números de teléfono y otra información en un texto, o convertir algunos formatos de datos. 

  • Rastreador web: en los rastreadores web, necesitamos analizar, extraer, filtrar y otras operaciones en las páginas web, y las expresiones regulares pueden ayudarnos a completar estas tareas de forma rápida y precisa. Por ejemplo, podemos usar expresiones regulares para extraer información como enlaces, imágenes y videos en páginas web, o para filtrar páginas web que cumplan ciertas condiciones. 

  • Lenguaje de programación: en el lenguaje de programación, la expresión regular también es una herramienta de uso común, que puede ayudarnos a realizar coincidencias de cadenas, reemplazo, segmentación y otras operaciones. Por ejemplo, en Python, podemos usar el módulo re para usar expresiones regulares para la manipulación de cadenas. 

En resumen, aprender expresiones regulares puede ayudarnos a mejorar la eficiencia del trabajo en procesamiento de texto, análisis de datos, rastreadores web, programación y otros campos, y también es una de las habilidades necesarias para los programadores.

2. ¿Qué es una expresión regular?

Una expresión regular describe un patrón de coincidencia de cadenas, que se puede usar para verificar si una cadena contiene una determinada subcadena, reemplazar la subcadena coincidente o extraer una subcadena que cumple una determinada condición de una espera de cadena.

Modo: un modo de cadena específico, que se compone de algunos símbolos especiales.

Algún tipo: También se puede entender como una especie de coincidencia aproximada.

Coincidencia exacta: seleccione * del blog donde title='python';

Coincidencia aproximada: seleccione * del blog donde el título sea '% python%';

Las expresiones regulares no son exclusivas de Python. Las expresiones regulares son compatibles con lenguajes como Java, PHP, Go y JavaScript.

3. Funciones de las expresiones regulares

① Verificación de datos (verificación de formulario, como teléfono móvil, correo electrónico, dirección IP)

② Recuperación de datos (recuperación de datos, captura de datos)

③ Ocultación de datos (1356235 Sr. Wang)

④ Filtrado de datos (filtrado de palabras clave sensibles del foro)...

3. Introducción del módulo re

1. ¿Qué es el módulo re?

Cuando necesite hacer coincidir cadenas a través de expresiones regulares en Python, puede usar un módulo re

2. El módulo re usa tres pasos

 
 
 
 

# Paso 1: Importar re módulo
importar re
# Paso 2: Usar el método de coincidencia para la operación de coincidencia
resultado = re.match (expresión regular de patrón, cadena para coincidir, banderas = 0)
# Paso 3: Si los datos Si la coincidencia es exitosa , utilice el método de grupo para extraer los datos
result.group()

Descripción del parámetro de la función de coincidencia:

parámetro

describir

patrón

hacer coincidir la expresión regular

cadena

La cadena para hacer coincidir.

banderas

El bit indicador se utiliza para controlar el modo de coincidencia de la expresión regular, por ejemplo: distinguir entre mayúsculas y minúsculas, coincidencia de varias líneas, etc. Consulte: Modificadores Regex - Indicadores opcionales

El método re.match devuelve un objeto coincidente si la coincidencia es exitosa; de lo contrario, devuelve Ninguno.

Podemos usar la función de objeto de coincidencia group(num) o groups() para obtener datos de coincidencia.

Una expresión regular puede contener algunos modificadores de bandera opcionales para controlar el patrón coincidente. Los modificadores se especifican como un indicador opcional. Se pueden especificar varias banderas mediante OR(|) bit a bit. Si re.I | re.M se establece en los indicadores I y M:

modificador

describir

re yo

Hacer que coincidan mayúsculas y minúsculas

re.L

Realice la coincidencia de reconocimiento de localización (locale-aware), esta función es compatible con la versión multilingüe del entorno del conjunto de caracteres, como el carácter de escape \w, en el entorno inglés, representa [a-zA-Z0-9_] , es decir, todos los caracteres y números en inglés. Si se usa en un entorno francés, por defecto, no puede coincidir con "é" o "ç". Añade esta opción L y podrás combinar. Sin embargo, esto no parece ser útil para el entorno chino, todavía no puede hacer coincidir los caracteres chinos.

movimiento rápido del ojo

coincidencia multilínea, afecta a ^ y $

re.S

hacer coincidir todos los caracteres, incluidas las líneas nuevas

re.U

Analiza los caracteres de acuerdo con el juego de caracteres Unicode. Esta bandera afecta a \w, \W, \b, \B.

re.X

VERBOSE, modo redundante, este modo ignora los espacios en blanco y los comentarios # en la expresión regular, como escribir una expresión regular que coincida con los buzones. Esta bandera le permite escribir expresiones regulares que son más fáciles de entender al brindarle un formato más flexible.

3. Métodos relacionados de módulo re

☆ re.match(patrón, cadena, banderas=0)

  • Haga coincidir desde el principio de la cadena, si la coincidencia es exitosa, devuelva el contenido coincidente; de ​​lo contrario, devuelva Ninguno

Descripción de parámetros:

  • patrón: la expresión regular que debe coincidir.

  • cadena: La cadena para hacer coincidir.

  • banderas: parámetro opcional, utilizado para controlar cómo se compara la expresión regular.

La función re.match() coincidirá con la expresión regular desde el principio de la cadena. Si la coincidencia es exitosa, devuelve un objeto Match, de lo contrario, devuelve Ninguno. El objeto Match contiene la información del resultado coincidente, que se puede obtener llamando al método del objeto Match.

Cabe señalar que re.match() solo coincidirá con el comienzo de la cadena. Si necesita hacer coincidir la expresión regular en toda la cadena, puede usar la función re.search().

Por ejemplo, el siguiente código demuestra cómo usar la función re.match() para hacer coincidir una expresión regular desde el principio de una cadena:

 
 
 
 

import re

string = "hola, mundo"
patrón = r"hola"

match_obj = re.match(patrón, cadena)
if match_obj:
print("Coincidencia exitosa")
else:
print("Coincidencia fallida")

La salida es:

 
 
 
 

coincidencia exitosa

En el código anterior, usamos la función re.match() para hacer coincidir una expresión regular desde el principio de la cadena.Como el principio de la cadena es "hola", la coincidencia es exitosa.

☆ re.findall(patrón, cadena, banderas=0)

Descripción de parámetros:

  • patrón: la expresión regular que debe coincidir.

  • cadena: La cadena para hacer coincidir.

  • banderas: parámetro opcional, utilizado para controlar cómo se compara la expresión regular.

La función re.findall() busca una cadena para una expresión regular y devuelve todos los resultados coincidentes. El resultado devuelto es una lista y cada elemento de la lista es un resultado coincidente.

Por ejemplo, el siguiente código demuestra cómo usar la función re.findall() para buscar números en una cadena:

 
 
 
 

import re

string ="Tengo 2 manzanas y 3 naranjas"
patrón =r"\d+"

resultado = re.findall(patrón, cadena)
print(resultado)

La salida es:

 
 
 
 

['2', '3']

En el código anterior, usamos la función re.findall() para buscar números en la cadena, y dado que la cadena contiene los dos números 2 y 3, se devuelve una lista que contiene estos dos números.

☆ re.finditer (patrón, cadena, banderas)

  • La función es la misma que findall anterior, pero devuelve un iterador

Descripción de parámetros:

  • patrón: cadena de patrón.

  • repl : La cadena de reemplazo, que también puede ser una función.

  • string : La cadena original que se buscará y reemplazará.

  • recuento: el número máximo de reemplazos después de la coincidencia de patrones, el valor predeterminado 0 significa reemplazar todas las coincidencias.

  • banderas: método de coincidencia:

  • re.I hace que la coincidencia no distinga entre mayúsculas y minúsculas, e I significa Ignorar para ignorar mayúsculas y minúsculas

  • re.S hace que coincidan todos los caracteres, incluidas las líneas nuevas

  • modo multilínea re.M, afectará a ^, $

La función re.finditer() busca una cadena para una expresión regular y devuelve todos los resultados coincidentes. El resultado devuelto es un iterador, y los resultados coincidentes se pueden obtener uno por uno a través del iterador.

Por ejemplo, el siguiente código demuestra cómo usar la función re.finditer() para buscar números en una cadena:

 
 
 
 

import re

string ="Tengo 2 manzanas y 3 naranjas"
patrón =r"\d+"

iter_obj = re.finditer(patrón, cadena)
for match_obj in iter_obj:
print(match_obj.group())

La salida es:

 
 
 
 

2
3

En el código anterior, usamos la función re.finditer() para buscar números en la cadena, y dado que la cadena contiene los dos números 2 y 3, se devuelve un iterador que contiene estos dos números. Atravesamos el iterador a través del bucle for, obtenemos los resultados coincidentes uno por uno y los imprimimos.

4. Inicio rápido con expresiones regulares

Caso 1: Encuentra si hay un número "8" en una cadena

 
 
 
 

import re


result = re.findall('8','13566128753')
# print(resultado)
if resultado:
print(resultado)
else:
print('No hubo coincidencia de datos')

Caso 2: averiguar si hay números en una cadena

 
 
 
 

import re


result = re.findall('\d','a1b2c3d4f5')
# print(resultado)
if resultado:
print(resultado)
else:
print('No se encontraron datos')

Caso 3: Encuentra si hay un no-número en una cadena

 
 
 
 

import re


result = re.findall('\D','a1b2c3d4f5')
# print(resultado)
if resultado:
print(resultado)
else:
print('No hubo coincidencia de datos')

4. Explicación detallada de las expresiones regulares

Escritura regular en tres pasos: qué verificar, cuánto verificar y dónde verificar

Las expresiones regulares generalmente se componen de dos partes de datos: caracteres ordinarios y metacaracteres Caracteres ordinarios: 0123456789abcd@... Metacaracteres: símbolos exclusivos de las expresiones regulares => [0-9], ^, *, +, ?

1. Qué revisar

el código

Función

(punto inglés)

Coincide con cualquier carácter (excepto \n)

[ ]

Coincide con uno de los caracteres enumerados en [ ], sustantivo profesional => grupo de caracteres

[^carácter especificado]

Coincide con un carácter que no sea el carácter especificado, ^sustantivo profesional=>tobyte

\d

Coincidencia de dígitos, es decir, 0-9

\D

coincide con un no dígito, es decir, no es un dígito

\s

Coincidencia de espacios en blanco, es decir, espacios, teclas de tabulación

\S

partido no en blanco

\w

Coincide con caracteres no especiales, es decir, az, AZ, 0-9, _

\W

Coincidencia de caracteres especiales, es decir, no alfabético, no dígito, no guion bajo

Escritura común de grupos de caracteres:

① [abcdefg] significa coincidir con cualquier carácter en caracteres abcdefg (1)

② [aeiou] significa hacer coincidir cualquiera de los cinco caracteres a, e, i, o, u

③ [az] significa coincidir con cualquiera de los 26 caracteres entre az

④ [AZ] significa coincidir con cualquiera de los 26 caracteres entre AZ

⑤ [0-9] significa coincidir con cualquiera de los 10 caracteres entre 0-9

⑥ [0-9a-zA-Z] significa hacer coincidir cualquier carácter entre 0-9, az, AZ

La combinación de grupo de caracteres + byte de juguete representa el significado de inversión:

① [^aeiou] significa coincidir con cualquier carácter excepto a, e, i, o, u

② [^az] significa coincidir con cualquier carácter excepto az

\d es equivalente a [0-9], lo que significa que coincide con cualquier número entre 0-9

\D es equivalente a [^0-9], lo que significa que coincide con caracteres que no son dígitos, solo uno puede coincidir

2. Comprobar cuánto

el código

Función

*

Coincide con el carácter anterior 0 veces o un número ilimitado de veces, puede ser opcional (de 0 a muchas)

+

Coincide con el carácter anterior 1 vez o ilimitadas veces, es decir, al menos 1 vez (1 a muchas)

?

Coincide con el carácter anterior 1 o 0 veces, es decir, 1 o ninguno (0 o 1)

{metro}

Coincide con el carácter anterior m veces, coincide con el número de teléfono móvil\d{11}

{metro,}

Hacer coincidir el carácter anterior al menos m veces, \w{3,}, significa que el carácter anterior debe aparecer al menos 3 veces, y puede ser un número ilimitado de veces como máximo

{Minnesota}

Coincide con el carácter anterior de m a n veces, \w{6,10}, lo que significa que el carácter anterior aparece de 6 a 10 veces

Sintaxis básica: Caracteres coincidentes normales. O \w o \S + seguimiento para verificar cuántas veces, como \w{6, 10} como .*, coinciden con el carácter anterior 0 o más veces

3. Dónde consultar

el código

Función

^

el partido comienza con una cadena

ps

el partido termina con una cadena

Extensión: Caja de herramientas normal

https://c.runoob.com/front-end/854/

https://c.runoob.com/front-end/7625/#!flags=&re=1[3-9]\d{9}

Crawler => xpath, especializado en rastreadores

rastreador + regular

reptil+xpath

Enfócate en aprender SQL

Cinco, varios conceptos importantes

1. Subexpresión (también conocida como agrupación)

En las expresiones regulares, el contenido encerrado por un par de paréntesis se denomina "subexpresión".

 
 
 
 

re.search(r'\d(\d)(\d)','abcdef123ghijklmn')

Nota: La r antes de la expresión regular de Python representa una cadena sin formato (rawstring), que declara que el contenido entre comillas representa el El significado original del contenido, evitando los problemas de barra invertida causados ​​por múltiples escapes.

En \d\d\d en la expresión regular, (\d)(\d) es una subexpresión, y hay dos () paréntesis, que representan dos subexpresiones

Nota: El método findall, si hay un grupo en el patrón, devuelve una lista que coincide con el grupo, por lo que el método findall no es adecuado para la operación de grupo, y se recomienda utilizar la búsqueda (coincidir con uno) o finditer ( combinar múltiples) métodos.

2. Captura

Cuando la expresión regular coincida con el contenido correspondiente en la cadena, el sistema informático colocará automáticamente el contenido coincidente con la subexpresión en el área de búfer correspondiente del sistema (el área de búfer comienza desde $1)

Presentación del caso:

 
 
 
 

import re


# Coincide con dos palabras idénticas consecutivas en la cadena
str1 ='abcdef123ghijklmn'
result = re.search(r'\d(\d)(\d)', str1)
print(result.group())
print(result. grupo(1))
imprimir(resultado. grupo(2))

3. Referencia posterior (referencia posterior)

En expresiones regulares, podemos referirnos al contenido en el área del búfer por \n (n representa el número del área del búfer n), y llamamos a este proceso "referencia inversa".

① 4 números consecutivos re.search(r'\d\d\d\d, str1)

1234, 5678, 6789

② 4 números consecutivos, pero el formato de los números es 1111, 2222, 3333, 4444, 5555?

re.buscar(r'(\d)\1\1\1, str1)

4. Algunas preguntas de práctica

① Encuentra cuatro números consecutivos, como: 3569

Respuesta: \d\d\d\do \d{4}

② Encuentra los mismos cuatro números consecutivos, como: 1111

Respuesta: (\d)\1\1\1

③ Encuentra números, como: 1221,3443

Respuesta: (\d)(\d)\2\1 El primer () se coloca en el búfer 1, si desea hacer referencia a \1 El segundo () se coloca en el búfer 2, si desea hacer referencia a \2

④ Encuentre caracteres, como: AABB, TTMM (pista: AZ, normal: [AZ])

答:([AZ])\1([AZ])\2

⑤ Encuentra los mismos cuatro números consecutivos o cuatro caracteres (pista: \w)

答:(\w)\1\1\1 1111 aaaa bbbb

6. Otros métodos de expresiones regulares

1. Seleccione un carácter coincidente

|Se pueden hacer coincidir varios casos de reglas: haga coincidir la cadena hellojava o hellopython

 
 
 
 

import re


str='hellojava, hellopython'
result = re.finditer(r'hello(java|python)',str)
if result:
for i in result:
print(i.group())
else:
print('no coincide a cualquier dato')

2. Alias ​​de grupo

el código

Función

(?PAG)

agrupar por alias

(?P=nombre)

Cita la cadena que coincide con el grupo de nombres de alias

Caso: partido

 
 
 
 

# 导入模块
import re

str1 ='<libro></libro>'
result = re.search(r'<(?P<mark>\w+)></(?P=mark)>', str1)

print( resultado.grupo())

3. Caso integral

①Requisito: en la lista ["manzana", "plátano", "naranja", "pera"], haga coincidir manzana y pera

 
 
 
 

import re

list1 =["apple","banana","orange","pear"]
str1 =str(list1)
result = re.finditer('(apple|pear)', str1)
if result:
for i in result:
print(i.group())
else:
print('未匹配到任何数据')

② 需求:匹配出163、126、qq等邮箱

 
 
 
 

import re

email ='[email protected], [email protected], [email protected]'
result = re.finditer('\w+@(qq|126|163).com', email)
if result:
for i in result:
print(i.group())
else:
print('未匹配到任何数据')

③需求 :  匹配qq:10567这样的数据,提取出来qq文字和qq号码

 
 
 
 

import re

str1 ='qq:10567'
result = re.split(r':', str1)
if result:
print(f'{result[0]}号:{result[1]}')
else:
print('未匹配到任何数据')

Supongo que te gusta

Origin blog.csdn.net/Blue92120/article/details/131332545
Recomendado
Clasificación