2012-09-26 36 views
32

Tôi có một chuỗi bằng Python, nói The quick @red fox jumps over the @lame brown dog.Python thay thế mô hình chuỗi với sản lượng của chức năng

Tôi đang cố gắng để thay thế mỗi người trong số những từ mà bắt đầu với @ với đầu ra của một chức năng mà phải mất từ ​​như một tranh luận.

def my_replace(match): 
    return match + str(match.index('e')) 

#Psuedo-code 

string = "The quick @red fox jumps over the @lame brown dog." 
string.replace('@%match', my_replace(match)) 

# Result 
"The quick @red2 fox jumps over the @lame4 brown dog." 

Có cách nào thông minh để thực hiện việc này không?

+1

những gì bạn có là tốt. bạn làm điều đó trong một tuyên bố. – tuxuday

Trả lời

58

Bạn có thể chuyển hàm đến re.sub. Hàm sẽ nhận đối tượng đối sánh làm đối số, sử dụng .group() để trích xuất kết quả dưới dạng chuỗi.

>>> def my_replace(match): 
...  match = match.group() 
...  return match + str(match.index('e')) 
... 
>>> re.sub(r'@\w+', my_replace, string) 
'The quick @red2 fox jumps over the @lame4 brown dog.' 
+1

Đẹp. Tôi không biết tôi có thể vượt qua một chức năng để re.sub, nhưng tôi cảm thấy như tôi sẽ có thể. – nathancahill

1

Hãy thử:

import re 

match = re.compile(r"@\w+") 
items = re.findall(string) 
for item in items: 
    string = string.replace(item, my_replace(item) 

này sẽ cho phép bạn thay thế bất cứ điều gì mà bắt đầu với @ với bất cứ điều gì đầu ra của chức năng của bạn là. Tôi không rõ lắm nếu bạn cần trợ giúp về chức năng này. Hãy cho tôi biết nếu đó là trường hợp

+0

're.findall (mẫu, chuỗi)' - hãy sửa –

+0

Điều này thực sự khá hữu ích vì nó cho phép bạn thay thế chỉ các phần tử phù hợp trong chuỗi. – Dannid

0

Một một ngắn với regex và giảm:

>>> import re 
>>> pat = r'@\w+' 
>>> reduce(lambda s, m: s.replace(m, m + str(m.index('e'))), re.findall(pat, string), string) 
'The quick @red2 fox jumps over the @lame4 brown dog.' 
4

Tôi không biết bạn có thể vượt qua một chức năng để một re.sub() một trong hai. Riffing trên @Janne Karila của câu trả lời để giải quyết một vấn đề tôi đã có, cách tiếp cận làm việc cho nhiều nhóm chụp, quá.

import re 

def my_replace(match): 
    match1 = match.group(1) 
    match2 = match.group(2) 
    match2 = match2.replace('@', '') 
    return u"{0:0.{1}f}".format(float(match1), int(match2)) 

string = 'The first number is [email protected], and the second number is [email protected]' 
result = re.sub(r'([0-9]+.[0-9]+)(@[0-9]+)', my_replace, string) 

print(result) 

Output:

The first number is 14.2, and the second number is 50.6000.

ví dụ đơn giản này đòi hỏi tất cả các nhóm chụp có mặt (không có nhóm tùy chọn).

Các vấn đề liên quan