将kwargs传递给re.sub()

时间:2012-10-07 18:34:49

标签: python regex ternary

在Python中,我正在尝试在模板字符串中实现伪三元运算符。如果kwargs具有特定密钥,则会将值插入到字符串中。

re模块有一种方法可以完全满足我在re.sub()中的需要,你可以传递一个在匹配时调用的函数。我不能做的是将**kwargs传递给它。代码如下

import re

template_string = "some text (pseudo_test?val_if_true:val_if_false) some text"

def process_pseudo_ternary(match, **kwargs):
    if match.groups()[0] in kwargs:
        return match.groups()[1]
    else:
        return match.groups()[2]

def process_template(ts, **kwargs):
    m = re.compile('\((.*)\?(.*):(.*)\)')
    return m.sub(process_pseudo_ternary, ts)

print process_template(template_string, **{'pseudo_test':'yes-whatever', 'other_value':42})

if match.groups()[0] in kwargs:当然是问题,因为process_pseudo_ternary的kwargs为空。

关于如何通过这些的任何想法? m.sub(function, string)不接受论证。

最后一个字符串是:some text val_if_true some text(因为字典有一个名为'pseudo_test'的键)。

随意将我重定向到字符串中的三元运算符的不同实现。我知道Python conditional string formatting。我需要三元组在字符串中,而不是在字符串的格式化元组/字典中。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你可以使用像http://docs.python.org/library/functools.html#functools.partial

这样的东西
return m.sub(partial(process_pseudo_ternary, custom_1=True, custom_2=True), ts)

编辑:改变一点,以更好地匹配您的代码。