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

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 字典和正则表达式模式,我如何获得字符串 "/robert/delete/"?

是否可能拥有像这样的函数?

def reverse(pattern, dictArgs):

Thank you


如果您有一个描述字符串的值字典,以您感兴趣的方式描述它...为什么需要使用正则表达式重新构建该字符串?您已经拥有所有使其不同的位。只需编写一个函数,将这些位作为参数并创建一个字符串即可。(换句话说,这是不可能的,您尝试这样做可能会浪费时间。) - Tomalak
我希望实现一个类似于 Django 中 reverse() 函数的功能,用于获取 URL 字符串。Django 是否只是使用 args 来“暴力”匹配模式? - 0xBAADF00D
1
如果说有的话,它是Python的事情,而不是Django的事情。但我的观点是这样的。例如,你如何反转"/robe[or]t?/(?P<action>((?!foo)[a-zA-Z0-9]*))"?由于正则表达式包含依赖彼此的可选和条件部分,因此无法从匹配列表返回原始字符串。因此,要么您定义一组非常狭窄的允许的正则表达式子集,并为其编写解析器,可能仍然会漏掉某些边缘情况并严重限制自己 - 要么您可以更有成效地利用时间。 ;) 正则表达式匹配是单向的。 - Tomalak
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是我的示例中的正则表达式字符串。你可以通过patter获取它。
regex_compiled.pattern

编辑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

0

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

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

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

等等。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接