如何使用参数填充正则表达式字符串

时间:2012-11-07 09:16:24

标签: python regex django string

我想用字符串填充正则表达式变量。

import re

hReg = re.compile("/robert/(?P<action>([a-zA-Z0-9]*))/$")
hMatch = hReg.match("/robert/delete/")
args = hMatch.groupdict()

args变量现在是一个带有{“action”:“delete”}的词典。

我如何扭转这一过程?使用args dict和regex模式,我如何获得字符串“/ robert / delete /”?

可以有这样的功能吗?

def reverse(pattern, dictArgs):

谢谢

3 个答案:

答案 0 :(得分:3)

这个功能应该这样做

def reverse(regex, dict):
    replacer_regex = re.compile('''
        \(\?P\<         # Match the opening
            (.+?)       # Match the group name into group 1
        \>\(.*?\)\)     # Match the rest
        '''
        , re.VERBOSE)

    return replacer_regex.sub(lambda m : dict[m.group(1)], regex)

你基本上匹配(\?P ...)块并用dict中的值替换它。

编辑:正则表达式是我的例子中的正则表达式字符串。你可以通过

来获取它
regex_compiled.pattern

EDIT2:添加了详细的正则表达式

答案 1 :(得分:0)

实际上,我认为这对于一些狭隘的案件是可行的,但是“一般情况下”相当复杂。

您需要编写某种有限状态机,解析正则表达式字符串,拆分不同的部分,然后对这些部分采取适当的措施。

对于常规符号 - 只需将符号“按原样”放入结果字符串中。 对于命名组 - 将dictArgs中的值放在它们的位置 对于可选块 - 放置一些值

等等。

一个requllar表达式通常可以匹配大的(甚至无限的)字符串集,因此这个“反向”函数不会非常有用。

答案 2 :(得分:0)

根据@ Dimitri的回答,可以进行更多的消毒。

retype = type(re.compile('hello, world'))
def reverse(ptn, dict):
    if isinstance(ptn, retype):
        ptn = ptn.pattern
    ptn = ptn.replace(r'\.','.')
    replacer_regex = re.compile(r'''
        \(\?P         # Match the opening
        \<(.+?)\>
        (.*?)
        \)     # Match the rest
        '''
        , re.VERBOSE)
#     return replacer_regex.findall(ptn)
    res = replacer_regex.sub( lambda m : dict[m.group(1)], ptn)
    return res