基于python中的匹配关键字重建正则表达式字符串

dlr*_*ust 5 python regex

正则表达式示例

regex = re.compile('^page/(?P<slug>[-\w]+)/(?P<page_id>[0-9]+)/$')
matches = regex.match('page/slug-name/5/')
>> matches.groupdict()
{'slug': 'slug-name', 'page_id': '5'}
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以将dict传递回正则表达式来重建字符串?

{'slug': 'new-slug', 'page_id': '6'}屈服page/new-slug/6/

unu*_*tbu 5

正则表达式方法对字符串进行操作.既然你有一个dict,我认为字符串format方法更合适:

In [16]: d={'slug': 'new-slug', 'page_id': '6'}

In [17]: 'page/{slug}/{page_id}'.format(**d)
Out[17]: 'page/new-slug/6'
Run Code Online (Sandbox Code Playgroud)

还有更复杂的正则表达式对下列哪些行不通的种种,但如果你总是使用非嵌套的命名匹配组(?P<name>...),并限制pat具有无非复杂\A,或者^,\Z或者$或者\b在您的正则表达式,否则的话,或许你可以做到这一点:

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/
Run Code Online (Sandbox Code Playgroud)


Ger*_*ult 1

这是使用 sre_parse 的解决方案

import re
from sre_parse import parse

pattern = r'^page/(?P<slug>[-\w]+)/(?P<page_id>[0-9]+)/$'
regex = re.compile(pattern)
matches = regex.match('page/slug-name/5/')
params = matches.groupdict()
print params
>> {'page_id': '5', 'slug': 'slug-name'}

lookup = dict((v,k) for k, v in regex.groupindex.iteritems())
frags = [chr(i[1]) if i[0] == 'literal' else str(params[lookup[i[1][0]]]) \
    for i in parse(pattern) if i[0] != 'at']
print ''.join(frags)
>> page/slug-name/5/
Run Code Online (Sandbox Code Playgroud)

它的工作原理是通过 parse() 获取原始操作码,转储位置操作码(它们的第一个参数为“at”),替换命名组,并在完成后连接碎片。