2012-11-07 31 views
7

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

import re 

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

args变量现在是{“action”:“delete”}的字典。

我怎么能扭转这个过程?与args字典和正则表达式模式,我如何获得字符串“/罗伯特/删除/”?

它可能有这样的功能?

def reverse(pattern, dictArgs): 

谢谢

+0

如果你有你的描述字符串值的字典扩展,你是感兴趣...为什么你需要一个正则表达式来重新构建该字符串?你已经拥有了所有能够改变世界的机会。只需编写一个函数来获取这些位并创建一个字符串。 (换句话说,这是不可能的,你可能会浪费你的时间尝试。) – Tomalak

+0

我想这个“功能”来实现像Django中使用的reverse()函数来获取URL字符串。有可能Django只是“粗暴”模式而已? – 0xBAADF00D

+1

如果有的话,这是一个Python的东西,而不是Django的东西。但我的观点是这样的。你会如何反转,例如'“/ robe [或] t?/(?P ((?!foo)[a-zA-Z0-9] *))”'?没有办法从匹配列表返回到原始字符串,因为正则表达式包含可选部分和条件部分,这些部分相互依赖。因此,要么定义一个允许的正则表达式的非常窄的子集,并为此编写一个解析器,可能仍然缺少一些副案例并严重限制自己 - 或者您花费更多的时间更有成效。 ;)正则表达式匹配是一条单行道。 – Tomalak

回答

2

这个功能应该这样做

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) 

你基本上匹配(\ 2 P ...)块,并使用从字典的值替换它。

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

regex_compiled.pattern 

EDIT2从图案得到它:详细的正则表达式添加

+0

这个功能在我的项目中效果很好,谢谢! – 0xBAADF00D

0

其实,我认为这是可行的一段狭窄的情况下,但“在一般情况下,”相当复杂的事情。

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

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

依此类推。

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

相关问题