métodos Regex operan en cadenas. Puesto que usted tiene un dict
, creo que el método de cadena format
es un mejor ajuste:
In [16]: d={'slug': 'new-slug', 'page_id': '6'}
In [17]: 'page/{slug}/{page_id}'.format(**d)
Out[17]: 'page/new-slug/6'
Hay todo tipo de expresiones regulares más complicado para el que el siguiente no funcionará, pero si siempre utiliza no -nested llamado grupos (?P<name>...)
partidos y restringir pat
a no tener nada más complicado que \A
, o ^
, \Z
o $
o \b
en su patrón de expresión de lo contrario, entonces tal vez usted podría hacer esto:
import re
import string
pat=r'\Apage/(?P<slug>[-\w]+)/(?P<page_id>[0-9]+)/\Z'
regex = re.compile(pat)
matches = regex.match('page/slug-name/5/')
print(matches.groupdict())
# {'page_id': '5', 'slug': 'slug-name'}
# Convert '(?P<slug>...)' to '{slug}'
reverse_pat=re.sub(r'\(\?P<(.*?)>.*?\)',r'{\1}',pat)
# Strip off the beginning^and ending $
reverse_pat=re.sub(r'^(?:\\A|\^)(.*)(?:\\Z|\$)$',r'\1',reverse_pat)
# drop any `\b`s.
reverse_pat=re.sub(r'\\b',r'',reverse_pat)
# there are many more such rules one could conceivably need...
print(reverse_pat.format(**matches.groupdict()))
# page/slug-name/5/
Este es un método muy bueno, más robusto que jugar con expresiones regulares como lo hice yo. – unutbu