2013-04-20 53 views
0

我試圖在滿足一定條件後創建字典。以下是代碼片段:替換字符串,如果正則表達式匹配,並與別的東西代替它匹配其他一些正則表達式

def dic_gen(exc): 
    param_errors = {re.sub(r"sss_", r"aaa_",err.name): err.address for err in exc.errors } 
    param_errors["status"] = "ERROR" 
    return param_errors 

什麼上面的代碼做的是,它會檢查是否有err.name然後sss_它消除,並創建一個字典。現在我還想添加另一個條件,如果它有「ttt_」,則用「bbb_」替換它是否可以使用re.sub?或者什麼是最有效的方式呢?

感謝,

回答

0

通過傳遞re.sub()的功能,而不是替換字符串,你可以這樣做:

def func(matchobj): 
    return 'aaa_' if matchobj.group(0) == 'sss_' else 'bbb_' 

def dic_gen(exc): 
    param_errors = {re.sub(r'(sss_)|(ttt_)', func, err.name): 
         err.address for err in exc.errors} 
    param_errors["status"] = "ERROR" 
    return param_errors 

由於功能只是一種表達,你可以做一個lambda了出來,並避免外部函數的定義(儘管它使代碼的可讀性):

def dic_gen(exc): 
    param_errors = {re.sub(r'(sss_)|(ttt_)', 
     lambda mo: 'aaa_' if mo.group(0) == 'sss_' else 'bbb_', err.name): 
     err.address for err in exc.errors} 
    param_errors["status"] = "ERROR" 
    return param_errors 
+0

謝謝@martineau – hjelpmig 2013-04-20 15:23:05

+0

不客氣。請注意我的修訂。 – martineau 2013-04-20 19:46:44

0

我不知道你打算與重新做什麼,但我會用:

abc = "Something_sss whatever" 
result = abc.replace("_sss","_ttt") 
print result 

結果:

"Something_ttt whatever" 
+0

我想要做的是,如果有sss_在err.name然後用aaa_取代它,如果它的ttt_然後用bbb_替換因爲我遍歷的EXC值,我在想,也許有做了一些內建的方法,這可能是更有效的。 – hjelpmig 2013-04-20 14:21:23