2012-05-04 17 views
6

Wenn re() Teil von Re für Python verwendet wird, kann eine Funktion für sub verwendet werden, wenn ich mich nicht irre. Mein Wissen geht es in dem Spiel, was auch immer Funktion zum Beispiel übergeben wird:Python Lambda mit Regex

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

Gibt es einen intelligenten Weg, um es in einem zweiten arg anders als mit einem Lambda-Pass zu haben, der eine Methode aufruft?

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

Antwort

8

können Sie functools.partial verwenden:

>>> 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 

In Ihrem Beispiel:

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

Und eine wirkliche Verwendung mit regulären Ausdrücken:

>>> 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

Ah danke! Fast das gleiche wie Lambda:] Wäre das der "pythonische" Weg, es näher zu kommen? – Stoof

+0

@Stefan mein Gefühl ist, dass die meisten Python-Meister teilweise mehr Python betrachten, obwohl es eher subjektiv sein kann. – brandizzi