2012-05-04 56 views
6

Gdy używasz re.sub() część re dla Pythona, funkcja może być używana dla sub, jeśli się nie mylę. Według mojej wiedzy przechodzi w meczu, aby cokolwiek funkcja jest przekazywana na przykład:Python lambda z regex

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

Czy istnieje lepszy sposób, aby go zdać w drugim arg inny niż z lambda, która wywołuje metodę?

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

Odpowiedz

8

Można użyć 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 

w Twojej przykładzie:

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

i prawdziwe korzystanie z regexes:

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

Ach dziękuję! Prawie tak samo jak lambda:] Czy byłby to bardziej "pytoniczny" sposób podejścia do niego? – Stoof

+0

@Stefan mym sentymentem jest to, że większość mistrzów Pythona uznałaby częściową bardziej pytonyczną, chociaż może być raczej subiektywna. – brandizzi