传递两个参数来替换Re.sub的函数

时间:2014-10-21 20:55:02

标签: python regex

如何将两个变量传递给我的替换函数?

我已将其定义为

def replace(line,suppress)

这样称呼它:

line = re.sub(r'''(?x)
                    ([\\]*\$\*)|
                    ([\\]*\$\{[0-9]+\})|
                    ([\\]*\$[0-9]+)|
                    ([\\]*\$\{[a-zA-Z0-9_]+\-.*\})|
                    ([\\]*\$\{[a-zA-Z0-9_]+\=.*\})|
                    ([\\]*\$[a-zA-Z0-9_]+)|
                    ([\\]*\$\{[a-zA-Z0-9_]+\})|
                    ([\\]*\$[\{]+.*)
                    ''',replace,line,suppress)

收到错误:

return _compile(pattern, flags).sub(repl, string, count)
TypeError: replace() takes exactly 2 arguments (1 given)

2 个答案:

答案 0 :(得分:3)

正如已经提到的,当re.sub调用你的函数时,它只传递一个参数。 docs表示这是一个匹配对象(可能是line变量?)

如果要传递其他参数,则应将函数包装在lambda表达式中。

类似于:

re.sub('...', lambda line: replace(line, suppress))

re.sub('...', lambda line, suppress=suppress: replace(line, suppress))

请注意在第二个suppress=suppress的签名中使用lambda。这是为了确保suppress的值在suppress 定义lambda的值。没有它,suppress的值是执行函数时suppress的值。在这种情况下,它实际上并不重要(因为lambda在定义之后立即使用,所以suppress永远不会在定义和执行之间改变),但我认为你理解它是多么重要lambda适用于将来使用它。

答案 1 :(得分:0)

Re.sub只接受其repl参数的函数,该参数取一个值。这是在Re.sub的实现中定义的。您无权访问它。