2012-05-04 33 views
6

Al usar re.sub() parte de re para python, se puede usar una función para sub si no me equivoco. Que yo sepa que pasa en el partido a lo que se pasa a la función, por ejemplo:Python lambda con expresión regular

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

¿Hay una manera más inteligente de tener que pasar en un segundo arg que no sea con una lambda que llama a un método?

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

Respuesta

8

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

En su ejemplo:

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

y un uso real con expresiones regulares:

>>> 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 gracias! Casi lo mismo que lambda:] ¿Sería esta la forma más "pitonica" de acercarse? – Stoof

+0

@Stefan mi opinión es que la mayoría de los maestros de Python considerarían parcial más pitonica, aunque puede ser bastante subjetiva. – brandizzi

Cuestiones relacionadas