1

以下の形式の入力ファイルがあります。

<ftnt>
<p><su>1</su> aaaaaaaaaaa </p>
</ftnt>
...........
...........
...........
... the <su>1</su> is availabe in the .........

値を置き換え、ftntタグ内のデータ全体を削除して、これを以下の形式に変換する必要があります。

"""...
...
... the aaaaaaaaaaa is available in the ..........."""

私が書いたコードを見つけてください。最初に、キーと値を辞書に保存し、グループ化を使用してキーに基づいて値を置き換えようとしました。

import re
dict = {}
in_file = open("in.txt", "r")
outfile = open("out.txt", "w")
File1 = in_file.read()

infile1 = File1.replace("\n", " ")
for mo in re.finditer(r'<p><su>(\d+)</su>(.*?)</p>',infile1):

     dict[mo.group(1)] = mo.group(2)

subval = re.sub(r'<p><su>(\d+)</su>(.*?)</p>','',infile1)
subval = re.sub('<su>(\d+)</su>',dict[\\1], subval)

outfile.write(subval)

で辞書を使用しようとしましre.subたが、KeyError. 原因がわかりません 使い方を教えてください。ここで何か助けていただければ幸いです。

4

1 に答える 1

0

まず、辞書に名前を付けないでください。そうしないとdict、関数が破壊されdictます。第二に\\1、文字列の外では機能しないため、構文エラーが発生します。str.formatを利用するのが最善の策だと思います

import re

# store the substitutions
subs = {}

# read the data
in_file = open("in.txt", "r")
contents = in_file.read().replace("\n", " ")
in_file.close()

# save some regexes for later
ftnt_tag = re.compile(r'<ftnt>.*</ftnt>')
var_tag = re.compile(r'<p><su>(\d+)</su>(.*?)</p>')

# pull the ftnt tag out
ftnt = ftnt_tag.findall(contents)[0]
contents = ftnt_tag.sub('', contents)

# pull the su
for match in var_tag.finditer(ftnt):
    # added s so they aren't numbers, useful for format
    subs["s" + match.group(1)] = match.group(2)

# replace <su>1</su> with {s1}
contents = re.sub(r"<su>(\d+)</su>", r"{s\1}", contents)

# now that the <su> are the keys, we can just use str.format
out_file = open("out.txt", "w")
out_file.write( contents.format(**subs) )
out_file.close()
于 2013-01-24T11:58:02.070 に答える