aprendizaje del rastreador de Python 21

aprendizaje del rastreador de Python 21

Esto es sobre la segunda mitad inconclusa del partido, estaba pensando en ayer... Oye, no hablemos
del portal en la primera mitad .

3. Expresiones regulares

2. partido

Como es habitual, en primer lugar se adjunta la tabla comparativa:

inserte la descripción de la imagen aquí

2-3 codiciosos y no codiciosos

Hemos aprendido la coincidencia del método de coincidencia antes, pero a veces el contenido que emparejamos no es el resultado que queremos:

# 贪婪与非贪婪
import re

content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*(\d+).*Demo$', content)
print(result)
print(result.group(1))

resultado de la operación:

inserte la descripción de la imagen aquí

En este caso, aún queremos obtener el número en el medio de la cadena, por lo que usamos (\d+) para hacer coincidir el número en el medio, lo cual no es problema. Hay demasiadas cosas en ambos lados del número, quiero evitar problemas, por lo que .* coincide directamente.

Pero en este momento, el resultado de nuestro partido final es solo un número, ¿por qué es esto?

Aquí viene la cuestión de la codicia y la no codicia. Bajo el mecanismo codicioso, el punto y el asterisco coincidirán con tantos caracteres como sea posible. En nuestra expresión, (\d+) representa al menos un dígito sin especificar cuántos dígitos coincidir, así que .* simplemente coincidirá con tantos caracteres como sea posible. , (dijiste que hay al menos uno, entonces te daré uno) Aquí, emparejaré todos los 123456.

Entonces, ¿cómo obtenemos el resultado final que queremos?

# 我缓缓打出了一个问号
import re

content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*?(\d+).*Demo$', content)
print(result)
print(result.group(1))

resultado de la operación:

inserte la descripción de la imagen aquí

Agregar un signo de interrogación a la expresión original cambia el mecanismo de coincidencia a no codicioso, de modo que .* coincida con la menor cantidad de caracteres posible.

Por lo tanto, intente usar coincidencias no codiciosas en el medio de la cadena cuando haga coincidencias, use .*? en lugar de .* para evitar problemas con coincidencias faltantes.

Pero si lo que queremos hacer coincidir está al final de la cadena, entonces .*? puede que no coincida con el contenido, porque coincidirá lo menos posible

import re

content = 'http://weibo.com/comment/KEracn'
res1 = re.match('^http.*?comment/(.*?)', content)
res2 = re.match('^http.*?comment/(.*)', content)

print('.*?  :', res1.group(1))
print('.*   :', res2.group(1))

resultado de la operación:

inserte la descripción de la imagen aquí

2-4 modificadores
import re

content = '''Hello 1234567 
            World_This is a Regex Demo'''
result = re.match('^He.*?(\d+).*?Demo$', content)
print(result)
print(result.group(1))

Es la misma expresión que antes, pero nuestro contenido se reemplaza por texto de varias líneas:

inserte la descripción de la imagen aquí

¿qué sucedió? ¿Qué sucedió? Por qué reportar un error

Al buscar en la tabla de comparación, podemos recordar que .* solo puede coincidir con todos los caracteres, excepto las líneas nuevas, por lo que nuestro enfoque multipropósito es cuestionado. ¡Por nuestra causa perezosa, es hora de introducir modificadores!

# 在原基础上只需要引入一个 re.S 参数即可

import re

content = '''Hello 1234567 
            World_This is a Regex Demo'''
result = re.match('^He.*?(\d+).*?Demo$', content, re.S)
print(result)
print(result.group(1))

resultado de la operación:

inserte la descripción de la imagen aquí

Este método se usa a menudo en el emparejamiento de páginas web, porque los nodos HTML suelen tener saltos de línea y, con él, se pueden evitar los errores causados ​​por los saltos de línea frecuentes.

Horario del modificador:

inserte la descripción de la imagen aquí

2-5 Partido de transferencia

En el proceso de escribir expresiones, ya sabemos que . se usa para hacer coincidir cualquier carácter que no sean líneas nuevas, entonces, ¿qué debemos hacer cuando nuestra expresión necesita usar . como símbolo común?

# 转义匹配

import re

content = '(百度)www.baidu.com'
res = re.match('\(百度\)www\.baidu\.com', content)
print(res)

resultado de la operación:

inserte la descripción de la imagen aquí

¡Arriba, hemos terminado de aprender el contenido común del método de coincidencia!

Termina hoy, mañana... depende de la situación

Supongo que te gusta

Origin blog.csdn.net/szshiquan/article/details/123719810
Recomendado
Clasificación