Curso de Programación en Python/RegEx-4

De WikiCabal
Saltar a: navegación, buscar
Pero, si queremos que coincida con una expresión regular en el comienzo de una cadena y sólo al principio?
El módulo re de Python proporciona dos funciones para que coincida con las expresiones regulares. Nos hemos encontrado 
ya uno de ellos, es decir, la search(). El otro tiene en nuestra opinión un nombre engañoso: match()
Fraudulenta, porque match(re_str, s) comprueba si re_str simplemente en el principio de la cadena.
Pero de todos modos, match() es la solución a nuestra pregunta, como podemos ver en el siguiente ejemplo:

[rrc@Pridd ~]$ python3
Python 3.4.3 (default, Jul  1 2015, 18:38:11) 
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> Str1 = "Paco es un nombre muy común"
>>> Str2 = "Se llamo Paco pero no es Mexicano"
>>> print( re.search( r"P..o", Str1 ) )
<_sre.SRE_Match object; span=(0, 4), match='Paco'>
>>> 
>>> print( re.search( r"P..o", Str2 ) )
<_sre.SRE_Match object; span=(9, 13), match='Paco'>
>>> print( re.match( r"P..o", Str1 ) )
<_sre.SRE_Match object; span=(0, 4), match='Paco'>
>>> print( re.match( r"P..o", Str2 ) )
None

Por lo tanto, esta es una manera para que coincida con el inicio de una cadena, pero es un método específico Python, 
es decir, no se puede utilizar en otros lenguajes como Perl, AWK y así sucesivamente. No es una solución general que 
es un estándar para las expresiones regulares:

El acento circunflejo '^' coincide con el principio de la cadena, y en MULTILINE (se explicará más abajo) modo también 
coincide inmediatamente después de cada nueva línea, que el método Python match() no hace.
El '^' tiene que ser el primer caracter de una expresión regular:

>>> print( re.search( r"^P..o", Str1 ) )
<_sre.SRE_Match object; span=(0, 4), match='Paco'>
>>> print( re.search( r"^P..o", Str2 ) )
None

Pero, ¿qué pasa si se concatena las dos cadenas Str1 y Str2 de la siguiente manera:

Str3 = Str2 + "\n" + Str1

Ahora la cadena no se inicia con un Paco de cualquier tipo, pero el nombre es después de un caracter de nueva línea:

>>> Str3 = Str2 + "\n" + Str1
>>> print( re.search( r"^P..o", Str3 ) )
None

El nombre no se ha encontrado, porque sólo el principio de la cadena está chequeando. Se Cambia, si utilizamos
el modo de MULTILINE, que puede ser activado mediante la adición de los siguientes terceros parámetros de búsqueda:

>>> print( re.search( r"^P..o", Str3, re.MULTILINE ) )
<_sre.SRE_Match object; span=(36, 40), match='Paco'>
>>> print( re.search( r"^P..o", Str3, re.M ) )
<_sre.SRE_Match object; span=(36, 40), match='Paco'>
>>> print( re.match( r"^P..o", Str3, re.M ) )
None
>>> 

El ejemplo anterior también muestra que el modo MULTILINE no afecta el método de match(). match() Nunca
comprueba nada, pero el principio de la cadena para un coincidencia.