我想用字符串填充正则表达式变量。
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):
谢谢
答案 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