正则表达式每次运行给出不同的结果

时间:2014-09-21 13:10:44

标签: python regex parsing

我将以下代码作为我正在处理的css预处理器的一部分。本节采用用户定义的变量并将其插入代码中。正则表达式只有在用空格,大括号,括号,逗号,引号或运算符包围时才会替换。当我运行它时,我每隔一段时间才会更换变量。

def insert_vars(ccss, variables):
    for var in variables.keys():
        replacer = re.compile(r"""(?P<before>[,+\[(\b{:"'])\$""" + var + """(?P<after>[\b}:"'\])+,])""")
        ccss = replacer.sub(r"\g<before>" + variables[var] + r"\g<after>", ccss)

        del replacer
        re.purge()

        return ccss.replace(r"\$", "$")

当我用

运行它时
insert_vars("hello $animal, $nounification != {$noun}ification.", {"animal": "python", "noun": "car"})

返回时间的50%

hello $animal, $nounification != {car}ification.

其他50%

hello $animal, $nounification != {$noun}ification.

任何人都知道为什么?

2 个答案:

答案 0 :(得分:1)

发生了什么事,因为return关键字是循环的一部分,acjr stated in the comments

这意味着循环只能运行一次迭代。

.keys()的排序未定义,'animal''noun'可能排在首位。

有一半时间,您的代码首先获得'noun',这样可以正常工作,或先获得'animal',这将无效。

因此,您应该将return的缩进减少到循环之外。

答案 1 :(得分:0)

def insert_vars(ccss, variables):
    pattern = re.compile(r"\$(?P<key>\w+)")
    def replacer(match):
        return variables.get(match.group('key'), match.group(0))
    return pattern.sub(replacer, ccss)