2013-02-20 1 views
0

검색 대체 패턴 전후에 파일에 기록해야합니다. 아래 코드를 작성했습니다. 필자는 출력 파일에 함수를 써서 잘 동작했습니다. 그러나 나는 약 20 가지의 대체 패턴을 가지고 있으며 모든 대체 코드를 작성해야하기 때문에 코드를 작성하지 않는다고 느낍니다. 이 방법을 구현하는 데 다른 방법이 있는지 알려 주시기 바랍니다.람다를 사용한 검색 패턴 교체

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

당신이 (?i)의 형태로 아래 re.IGNORECASE 플래그를 넣어 내가 왜 보지 않았다, 그래서 그것을 다음과 같은 솔루션을 사용하지 않는, 그리고 패턴은 필요에 따라 대문자로 문자로 작성되어 샘플 당신이 파일을 열 수 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

의견에 감사드립니다. 왜냐하면 나는 파이썬에 익숙하지 않기 때문에 그 방법으로 파일을 여는 것이다. ripl 함수에 대해 설명해 주시겠습니까? –

+0

검색 대체 패턴 전후에 포함 된 보고서를 만들 수 없습니다. –

+0

@ new2python''ripl()''은 매개 변수''ma''에서 MatchObject를 받기위한 함수입니다. 그것은 사전''d''를 사용합니다. 이 사전을 매개 변수 "d"에 대한 기본값으로 둡니다. 실제로 함수는''def ripl (ma, dico) :''에 의해 정의 될 수 있고''dico''는 함수 블록에서''d''를 대신 할 것입니다 :''dico [ma.group (1) ] [0]''와''dico [ma.group (1)] [1]''을 사용합니다. 함수 정의의 실행은 한 번만 실행되기 때문에 매개 변수의 기본값을 정의하는 것은 흥미 롭습니다 (정의에 따르면 함수를 설명하는 텍스트 블록을 이해해야합니다) – eyquem