2014-02-13 29 views
0

我有两个文本文件,并用第二个文件中的实际匹配替换了XXX占位符 - 按第二个文件中给出的顺序。Python - 用不同的替换替换字符串中的multipe匹配

第一个文本是一行中包含多行和多个占位符的文件。

欧盟由以下国家组成:XXX,XXX,XXX,XXX,XXX,... 欧盟内的三大国家是XXX,XXX,XXX。

第二个文件是每行一个匹配的列表:

波兰 荷兰 丹麦 西班牙 意大利 德国 法国

我想拥有它取代如下:

欧盟由下列国家组成:波兰,荷兰,丹麦,西班牙,意大利...... 欧盟内部三大国家斯洛登联盟是德国,法国,XXX。

到目前为止,我有这个编码:

import re 
file1 = open("text.txt") 

file2 = open("countries.txt") 
output = open("output.txt", "w") 
countrylist = [] 

i=0 
for line in file2: 
    countrylist[i:] = verweise 
    i=i+1 

j=0 
for line in file1: 
    if "XXX" in line: 
     line = re.sub("XXX", countrylist[j], line) 
     j=j+1 
    output.write(line) 
    output.flush() 
output.close 

我的问题是,正则表达式更换不仅适用于第一次出现/比赛,但整个第一线。所以我现在的输出结果如下:

欧盟由以下州组成:波兰,波兰,波兰,波兰,波兰...... 欧盟范围内的三个最大的国家是荷兰,荷兰,荷兰。

如何将XXX的每一次出现与我的国家/地区列表中的一行匹配?

感谢您的帮助!

回答

0

在re模块.sub(replacement, string[, count=0]) count = 1应该只替换第一次出现。

0

您可以拨打为每一个功能匹配sub认定:

countries = [ 'Poland', 'Netherlands', 'Denmark', 'Spain', 'Italy' ] 

def f(match, countriesIter=iter(countries)): 
    return countriesIter.next() 

line = "The European Union consists of the following states XXX, XXX, XXX, XXX, XXX" 

print re.compile('XXX').sub(f, line) 

这将打印:

The European Union consists of the following states Poland, Netherlands, Denmark, Spain, Italy 

取决于你的知识可能是最好使用一个全局计数器来逐步国名列表:

count = 0 
def f(match): 
    global count 
    result = countries[count] 
    count += 1 
    return result 

这是不太优雅b如果你对Python内部和发生器没有更深入的经验等等,可以更好地理解它。