2013-02-20 63 views
0

我需要使用Before和After搜索替換模式寫入文件。我寫了下面的代碼。我已經使用函數寫入輸出文件,它工作正常。但我有大約20個這樣的替換模式,我覺得我不寫一個好的代碼,因爲我需要爲所有這些替換創建函數。你能否讓我知道有沒有其他的方式來實施?使用lambda搜索模式替換

import re 

Report_file = open("report.txt", "w") 
st = '''<TimeLog> 
<InTime='10Azx'>1056789</InTime> 
<OutTime='14crg'>1056867</OutTime> 
<PsTime='32lxn'>1056935</PsTime> 
<ClrTime='09zvf'>1057689</ClrTime> 
</TimeLog>''' 

def tcnv(str): 
    Report_file.write("Previous TS: " + str + "\n\n") 
    v1 = re.search(r"(?i)<clrtime='(\d+\w+)'>", str) 
    val1 = v1.group(1) 

    v2 = re.search(r"(?i)(<clrtime='(\d+\w+)'>(.*?)</clrtime>)", str) 
    val2 = v2.group(3) 

    soutval = "<Clzone><clnvl='" + val1 + "'>" + val2 + "</clnvl></Clzone>" 
    Report_file.write("New TS: " + soutval + "\n") 
    return soutval 


st = re.sub(r"(?i)(<clrtime='(\d+\w+)'>(.*?)</clrtime>)", lambda m: tcnv(m.group(1)), st) 
st = re.sub(r"(?i)<intime='(\d+\w+)'>(.*?)</intime>", "<Izone><Invl='\\1'>\\2</Invl></Izone>", st) 
st = re.sub(r"(?i)<outtime='(\d+\w+)'>(.*?)</outtime>", "<Ozone><onvl='\\1'>\\2</onnvl></Ozone>", st) 
st = re.sub(r"(?i)<pstime='(\d+\w+)'>(.*?)</pstime>", "<Pszone><psnvl='\\1'>\\2</psnvl 

回答

1

我不明白你爲什麼把re.IGNORECASE標誌(?i)形式下,所以我不使用它下面的解決方案,並將該圖案寫有必要根據大寫的字母你的樣品,你應該使用with語句來打開文件

注意,它會好得多:

with open('filename.txt','rb') as f: 

    ch = f.read() 

答案

import re 

st = '''<InTime='10Azx'>1056789</InTime> 
<OutTime='14crg'>1056867</OutTime> 
<PsTime='32lxn'>1056935</PsTime> 
<ClrTime='09zvf'>1057689</ClrTime> 
''' 

d = dict(zip(('InTime','OutTime','PsTime','ClrTime'), 

       (('Izone><Invl','/Invl></Izone'), 
       ('Ozone><onvl','/onnvl></Ozone'), 
       ('Pszone><psnvl','/psnvl></Pszone'), 
       ('Clzone><clnvl','/clnvl></Clzone')) 
      ) 
     ) 

def ripl(ma,d=d): 
     return "<{}='{}'>{}<{}>".format(d[ma.group(1)][0], 
             ma.group(2), 
             ma.group(3), 
             d[ma.group(1)][1]) 

st2 = re.sub(r"<(InTime|OutTime|PsTime|ClrTime)='(\d+\w+)'>(.*?)</\1>", 
      ripl, st) 

print '%s\n\n%s\n' % (st,st2) 
+0

感謝您的反饋。因爲我是新來的python我打開這種方式的文件。你能解釋一下ripl的功能嗎? – 2013-02-20 14:01:40

+0

我無法創建包含搜索替換模式之前和之後的報告。 – 2013-02-20 14:06:49

+0

@ new2python''ripl()''是一個用來接收參數''ma''上的MatchObjects的函數。它使用字典「d」。我把這個字典作爲參數''d''的默認值。實際上,函數可以用def ripl(ma,dico)來定義:''和參數'dico''將替換函數塊中的''d'':''dico [ma.group(1) ] [0]''和''dico [ma.group(1)] [1]''。定義參數的默認值是很有趣的,因爲函數定義的執行只執行一次(根據定義,您必須理解:描述函數的文本塊) – eyquem 2013-02-20 14:10:00