2013-01-24 68 views
1

使用Python解釋我在下面的格式輸入文件:文本替換在應用re.sub

<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。我不知道爲什麼會發生這種情況,請告訴我如何使用。我很感謝這裏的任何幫助。

+0

在格式化問題中的代碼時使用四個空格。它更清晰,不會在代碼片段之間留下空格 – TerryA

+0

我編輯了格式,如果出現錯誤,請糾正(使用問題下的[編輯]鏈接)。 –

+0

[不再](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags)... –

回答

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() 
+0

非常感謝。這對我很有幫助。 –