Son símbolos que indican un comportamiento especial como repetición, rango, exclusión o separación.
. ^ $ * + ? { } [ ] \ | ( )
.
Indica cualquier carácter (letras, números, signos de puntuación, espacios) excepto una nueva línea (\n):
>>> re.findall('.', 'Benevolent dictator')
['B', 'e', 'n', 'e', 'v', 'o', 'l', 'e', 'n', 't', ' ', 'd', 'i', 'c', 't', 'a', 't', 'o', 'r']
>>> re.findall('.', 'Benevolent\ndictator') #Ignora la nueva línea (\n)
['B', 'e', 'n', 'e', 'v', 'o', 'l', 'e', 'n', 't', 'd', 'i', 'c', 't', 'a', 't', 'o', 'r']
>>> re.findall('.', 'Benevolent\tdictator') #Pero no ignora la tabulación (\t)
['B', 'e', 'n', 'e', 'v', 'o', 'l', 'e', 'n', 't', '\t', 'd', 'i', 'c', 't', 'a', 't', 'o', 'r']
*
Tiene en cuenta el carácter anterior cero o más veces. Por ejemplo, el patrón "in*o" identifica estas combinaciones: io (ninguna presencia de la "n"), ino (una aparición de la "n"), inno (dos apariciones de la "n").
>>> re.findall('in*o', 'inocencia, innovaciones')
['ino', 'inno', 'io']
+
Indica el carácter anterior una o más veces:
>>> re.findall('in+o', 'inocencia, innovaciones')
['ino', 'inno']
[ ]
Indica que puede haber una coincidencia con cualquier carácter entre los corchetes. También se puede incluir el rango entre los corchetes:
[a-z] : cualquier letra minúscula
[0-9] : cualquier dígito
[a-dA-D] : las letras de la a la d minúsculas o mayúsculas
>>> re.findall('cu[sz]co', 'se puede escribir cusco o cuzco')
['cuzco', 'cusco']
Se puede señalar un rango usando guión. Por ejemplo, [0-9] busca cualquier dígito entre 0 y 9.
>>> re.findall('[0-9]', '3 de enero de 2014')
['3'] # el único con una sola cifra
[^ ]
Busca cualquier caracter excepto el indicado en corchetes
>>> re.findall('est[^a]s', 'estas, estos, estes')
['estos', 'estes']
{ n }
Repite el elemento previo n veces. Se puede definir un rango de coincidencias
{2,4} : de 2 a 4 caracteres siendo el comportamiento "voraz", es decir, primero trata de hacer coincidir cuatro caracteres, luego tres, luego dos.
{2,} : indica dos o más caracteres.
>>> re.findall('[a-z]{3}', 'Django es un framework de desarrollo web')
['jan', 'fra', 'mew', 'ork', 'des', 'arr', 'oll', 'web']
>>> re.findall('[a-z]{3,4}', 'Django es un framework de desarrollo web')
['jang', 'fram', 'ewor', 'desa', 'rrol', 'web']
>>> re.findall('[a-z]{3,}', 'Django es un framework de desarrollo web')
['jango', 'framework', 'desarrollo', 'web']
^ $
Buscan al comienzo y al final de la cadena de texto respectivamente.
>>> re.findall('^Django', 'Django es un framework de desarrollo web')
['Django']
>>> re.findall('^web', 'Django es un framework de desarrollo web')
[] # 'web' no está al comienzo de la cadena
>>> re.findall('web$', 'Django es un framework de desarrollo web')
['web'] # 'web' está al final de la cadena
?
Busca una o cero coincidencias del caracter anterior.
i?python : busca python o ipython.
>>> re.findall('i?python', 'ipython es iron python')
['ipython', 'python']
\
Permite ignorar caracteres especiales como [], ?, +, etc. Por ejemplo, si queremos analizar operaciones matemáticas debemos ignorar el significado de + y * en el módulo de expresiones regulares:
>>> re.split(' \+ ', '4 + 8') #Queremos extraer sólo los números
['4', '8']
|
Identifica un patrón u otro siendo su comportamiento "no voraz (not greedy)", es decir, al encontrar la coincidencia de la izquierda se detiene. Por ejemplo, queremos sustituir un anglicismo:
>>> re.sub('basket|basketball', 'baloncesto', 'Jugadores de basketball de la liga nacional de basket') #Encuentra basketball y lo sustituye por baloncestoball
'Jugadores de baloncestoball de la liga nacional de baloncesto'
Para corregir este comportamiento simplemente colocamos el más largo primero:
>>> re.sub('basketball|basket', 'baloncesto', 'Jugadores de basketball de la liga nacional de basket')
'Jugadores de baloncesto de la liga nacional de baloncesto'
()
Los paréntesis agrupan expresiones regulares e indican el comienzo y el final de un grupo. Findall agrupa las coincidencias en tuplas:
>>> re.findall(r"(\w+): (\w+)", "nombre: Gabriel, apellido: Marquez, numero: 3")
[('nombre', 'Gabriel'), ('apellido', 'Marquez'), ('numero', '3')]
(?:)
Agrupa expresiones regulares pero no captura coincidencias. Esto es más evidente al usar split:
>>> re.split(r"(?:\w+):", "nombre: Gabriel, apellido: Marquez, numero: 3")
['', ' Gabriel, ', ' Marquez, ', ' 3']
Comparemos al usar sólo paréntesis:
>>> re.split(r"(\w+):", "nombre: Gabriel, apellido: Marquez, numero: 3")
['', 'nombre', ' Gabriel, ', 'apellido', ' Marquez, ', 'numero', ' 3']
(?P:<>)
Agrupa coincidencias que pueden ser referenciadas por un nombre:
>>> patron = r'(?P<mes>[\d])/(?P<dia>[\d])/(?P<año>[0-9][0-9][0-9][0-9])'
>>> m = re.search(patron, 'nacio en 7/2/1978')
>>> m.group('año')
'1978'
>>> m.group('mes')
'7'
>>> m.group('dia')
'2'
Un ejemplo de la página del tutorial de django:
urlpatterns = [ # ex: /polls/ url(r'^$', views.index, name='index'), # ex: /polls/5/ url(r'^(?P[0-9]+)/$' , views.detail, name='detail'), # ex: /polls/5/results/ url(r'^(?P[0-9]+)/results/$' , views.results, name='results'), # ex: /polls/5/vote/ url(r'^(?P[0-9]+)/vote/$' , views.vote, name='vote'), ]
No hay comentarios.:
Publicar un comentario