8

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

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):

谢谢

4

3 回答 3

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...) 块并将其替换为字典中的值。

编辑:正则表达式是我的例子中的正则表达式字符串。你可以从模式中得到它

regex_compiled.pattern

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

于 2012-11-07T10:44:31.793 回答
0

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

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

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

等等。

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

于 2012-11-07T10:35:05.130 回答
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
于 2018-06-06T18:33:24.333 回答