2014-02-13 2 views
0

두 번째 텍스트 파일이 있고 두 번째 파일에서 지정된 순서대로 두 번째 파일의 실제 일치 항목으로 XXX 자리 표시자를 바꿉니다.파이썬 - 다른 교체 문자열로 멀티페어 일치 바꾸기

첫 번째 텍스트는 한 줄에 여러 줄과 여러 자리 표시자가있는 파일입니다.

유럽 연합은 다음과 같은 상태로 구성됩니다. XXX, XXX, XXX, XXX, .... 유럽 연합 내에서 가장 큰 세 국가는 XXX, XXX, XXX입니다.

폴란드 네덜란드 덴마크 스페인 이탈리아 독일 프랑스

다음으로 내가를 교체하고 싶습니다

:

두 번째 파일은 한 줄에 하나의 일치와 목록입니다

유럽 연합 (EU)은 폴란드, 네덜란드, 덴마크, 스페인, 이탈리아, ...로 구성됩니다. Eu 내의 3 대국 독일, 프랑스, ​​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

다시 모듈 .sub(replacement, string[, count=0])에서 첫 번째 발생 만 대체해야합니다.

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 

이 지식에 따라 그것을 통해 단계로 글로벌 카운터를 사용하는 것이 더 좋을 수도

당신은 각 함수를 호출 할 수 있습니다
0

sub 발견 일치 국가 이름 목록 :

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

이것은 덜 우아합니다. b 파이썬 내부 및 생성기에 대한 더 깊은 경험이없는 경우에 대비하여 더 잘 이해할 수 있습니다.

관련 문제