2012-05-04 14 views
6

pythonのreの部分を使うと、誤っていないと関数をsubに使うことができます。Python lambda with regex

r = re.compile(r'([A-Za-z]') 
r.sub(function,string) 

は、それがメソッドを呼び出すラムダとの以外の第二引数に渡す持っているよりスマートな方法はありますか?A:私の知る限りでは、それは、例えば渡されたどんな関数にマッチして渡しますか

r.sub(lambda x: function(x,arg),string) 

答えて

8

あなたはfunctools.partialを使用することができます。

>>> from functools import partial 
>>> def foo(x, y): 
...  print x+y 
... 
>>> partial(foo, y=3) 
<functools.partial object at 0xb7209f54> 
>>> f = partial(foo, y=3) 
>>> f(2) 
5 

あなたの例では:

def function(x, y): 
    pass # ... 
r.sub(functools.partial(function, y=arg),string) 

そして、正規表現での実際の使用:

>>> s = "the quick brown fox jumps over the lazy dog" 
>>> def capitalize_long(match, length): 
...  word = match.group(0) 
...  return word.capitalize() if len(word) > length else word 
... 
>>> r = re.compile('\w+') 
>>> r.sub(partial(capitalize_long, length=3), s) 
'the Quick Brown fox Jumps Over the Lazy dog' 
+0

ああはあなたに感謝!ラムダとほぼ同じです:]これはそれに近づくためのより "ピジョン"な方法でしょうか? – Stoof

+0

@Stefan私の感想は、ほとんどのPythonのマスターは、かなり主観的ではあるかもしれないが、部分的にもっとpythonicだと思うということです。 – brandizzi