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

时间:2011-02-07 23:34:38

标签: 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'}

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

即。 {'slug': 'new-slug', 'page_id': '6'}会产生page/new-slug/6/

4 个答案:

答案 0 :(得分: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'

有各种更复杂的正则表达式,以下内容不起作用,但是如果你总是使用非嵌套的命名匹配组(?P<name>...)并限制pat没有比{更复杂的{ {1}},或者你的正则表达式模式中的\A^\Z$,否则,也许你可以这样做:

\b

答案 1 :(得分:3)

这是一个不需要新正则表达式的解决方案:

import re
import operator

regex = re.compile('^page/(?P<slug>[-\w]+)/(?P<page_id>[0-9]+)/$')
matches = regex.match('page/slug-name/5/')
groupdict = {'slug': 'new-slug', 'page_id': '6'}
prev_index = matches.start(0)
new_string = ""
for group, index in sorted(regex.groupindex.iteritems(), key=operator.itemgetter(1)):
    new_string += matches.string[prev_index:matches.start(index)] + groupdict[group]
    prev_index = matches.end(index)

new_string += matches.string[prev_index:matches.end(0)]
print new_string
# 'page/new-slug/6/'

这可以通过用groupdict中提供的值替换命名组来工作,其余的字符串是使用输入字符串(matches.string)上的切片插入的。 new_string将是原始字符串中与正则表达式匹配的相关替换部分。要让new_string甚至包含字符串的不匹配部分,请将prev_index = matches.start(0)替换为prev_index = 0,并在for循环后从最后一个切片中删除matches.end(0)

答案 2 :(得分:1)

Django的django.core.urlresolvers.reverse_helper似乎能够做到这一点(有趣的是,它使用正则表达式来解析正则表达式)。

您可以重复使用它提供的reverse_helperMatchChecker

答案 3 :(得分: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/

这可以通过parse()获取原始操作码,转储位置操作码(他们在第一个参数中使用'at'),替换命名组,并在完成时连接frags。