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
4

1 に答える 1

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)
于 2013-02-20T13:57:10.633 に答える