Regular Expressions
Trampas Regex
Buscar..
¿Por qué el punto (.) No coincide con el carácter de nueva línea ("\ n")?
.*
en regex básicamente significa "capturar todo hasta el final de la entrada".
Entonces, para cadenas simples, como hello world
.*
Funciona perfectamente. Pero si tiene una cadena que representa, por ejemplo, líneas en un archivo, estas líneas estarán separadas por un separador de línea , como \n
(nueva línea) en sistemas similares a Unix y \r\n
(retorno de carro y nueva línea) en Windows
Por defecto en la mayoría de los motores de expresiones regulares, .
no coincide con los caracteres de nueva línea, por lo que la coincidencia se detiene al final de cada línea lógica . Si quieres .
para hacer coincidir realmente todo, incluidas las nuevas líneas, debe habilitar el modo "punto-coincidencias-todo" en el motor de re.DOTALL
regulares de su elección (por ejemplo, agregue re.DOTALL
flag en Python, o /s
en PCRE).
¿Por qué una expresión regular omite algunos paréntesis / paréntesis de cierre y los combina después?
Considera este ejemplo:
Entró en el café "Dostoevski" y dijo: "Buenas noches".
Aquí tenemos dos conjuntos de citas. Asumamos que queremos hacer coincidir ambas, de modo que nuestra expresión regular coincida con "Dostoevski"
y "Good evening."
Al principio, podrías estar tentado a hacerlo simple:
".*" # matches a quote, then any characters until the next quote
Pero no funciona: coincide con la primera cita en "Dostoevski"
y hasta la cita de cierre en "Good evening."
, incluyendo el and said:
parte. Demo regex101
¿Por qué sucedió?
Esto sucede porque el motor de expresiones regulares, cuando se encuentra .*
, "Consume" toda la entrada hasta el final. Luego, debe coincidir con la final "
. Por lo tanto," retrocede "desde el final de la coincidencia, soltando el texto coincidente hasta que se encuentre el primer "
y, por supuesto, es el último "
en la coincidencia , al final de la parte "Good evening."
.
¿Cómo evitar esto y coincidir exactamente con las primeras citas?
Use [^"]*
. No come toda la entrada, solo hasta la primera "
, según sea necesario. Demo regex101