2012-05-04 33 views
6

Khi sử dụng re.sub() một phần của lại cho python, một hàm có thể được sử dụng cho phụ nếu tôi không nhầm. Theo hiểu biết của tôi, nó vượt qua trong trận đấu với bất kỳ chức năng nào được chuyển qua ví dụ:Python lambda với regex

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

Có cách nào thông minh hơn để chuyển nó vào arg thứ hai khác với lambda gọi phương thức không?

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

Trả lời

8

Bạn có thể sử dụng 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 

Trong ví dụ của bạn:

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

Và việc sử dụng thực tế với 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

Ah cảm ơn bạn! Hầu như giống như lambda:] Liệu đây có phải là cách tiếp cận "pythonic" hơn không? – Stoof

+0

@Stefan tình cảm của tôi là hầu hết các bậc thầy Python sẽ xem xét một phần pythonic hơn, mặc dù nó có thể khá chủ quan. – brandizzi