从命名组中解析正则表达式

时间:2015-06-06 22:30:03

标签: python regex

以下是我与/api/(?P<version>v[0-9]+)/endpoint合作的示例表达。

我想做两件事:

  1. 获取指定的群组,即version
  2. 对于命名组,获取与其关联的表达式,即v[0-9]+
  3. 第一部分可以从编译的正则表达式中获取:

    >>> r = re.compile('/api/(?P<version>v[0-9]+)/endpoint')
    >>> r.groupindex 
    {'version': 1}
    

    我想知道是否有任何东西可以让我从已解析的版本中获取表达式#39;例如,小组。

2 个答案:

答案 0 :(得分:2)

您可以创建一个基本类,它接受一个模板字符串,一些由kwargs(或字典)填充的参数,然后代理对编译的正则表达式对象的所有其他属性访问,例如:

import re

class myre(object):
    def __init__(self, template, *args, **kwargs):
        self.expressions = dict(kwargs)
        subs = {k: '(?P<{}>{})'.format(k, v) for k, v in self.expressions.items()}
        self.rx = re.compile(template.format(**subs), *args)
    def __getattr__(self, name):
        return getattr(self.rx, name)

然后使用如下:

r = myre('/api/{version}/endpoint', version='v[0-9]+')
print r.expressions['version'] # get expression for named group
# v[0-9]+

print list(r.expressions) # get list of named groups
# ['version']

# match as normal
print r.match('/api/v5/endpoint').group('version')
# v5

答案 1 :(得分:0)

您需要自己实现。例如:

group = {'version': 'v[0-9]+'}
r = re.compile('/api/(?P<{}>{})/endpoint'.format('version', group['version']))

稍后您可以将群组名称version映射回其正则表达式v[0-9]+