특수 문자로 String.replace () 일부만 대체

Aug 22 2020

이 사이트와 다른 사이트에서 문자를 교체하는 것에 대한 많은 다른 게시물을 보았으며 이전에 문자열 교체를 수행했습니다. 그러나이 특정 경우에는 예기치 않은 문제가 발생합니다. 뻔한 게 빠졌 으면 좋겠는데 ...

특수 문자 목록을 HTML 엔티티 코드로 바꾸려고합니다. 나는 바이트 인코딩 문자열을 사용하여 일반 텍스트 교체 ( ½~ ½)에서 마지막 반복에 이르기까지 몇 가지 버전을 시도했습니다 ( 여기에 제안 )

내 코드의 기능은 매우 간단합니다. 파일 내용을 얻습니다.

with open(cur_file, 'r', encoding='utf-8') as file_handle:
    file_contents = file_handle.read()
file_handle.close()

그런 다음 'replacer ()'함수를 호출합니다.

good_text = replacer(file_contents)

replacer () 함수의 내용 :

def replacer(text):
    replace_chars = {
        b'\xc2\xbd': '½',    #½
        b'\xe2\x80\x9c': '"',  #“
        b'\xe2\x80\x9d': '"',  #”
        b'\xe2\x80\x99': '´', #’
        b'\xe2\x80\x93': '—', #–
        b'\xc2\xa9': '©'       #©
    }
    
    for k, v in replace_chars.items():
        good_text = text.replace(k.decode('utf-8'), v)
        print('replacing ' + k.decode('utf-8') + ' with ' + v)
    return good_text

그런 다음 새 텍스트를 파일에 다시 저장합니다.

    with open(cur_file, 'w', encoding='utf-8') as file_handle:
        file_handle.write(good_text)
    file_handle.close()
    
    print('Done!')

콘솔에서 이것을 실행하고 다음을 얻습니다.

replacing ½ with ½
replacing “ with "
replacing ” with "
replacing ’ with ´
replacing – with —
replacing © with ©
Done!

예상대로입니다. 그러나 문자열을 바꾸는 파일에는 다음 내용이 있습니다.

replace_chars = {
        '½': '½',
        '“': '"',
        '”': '"',
        '’': '´',
        '–': '—',
        '©': '©'

파일 ½이 첫 번째 열에 또는 다른 문자 를 포함하지 않을 것으로 예상 하지만 대신 다음과 유사합니다.'©': '©'

답변

2 Barmar Aug 22 2020 at 05:23

루프를 통과 할 때마다 이전 교체의 결과가 아니라 원본 텍스트에서 교체됩니다. 따라서 최종 결과는 전부가 아니라 마지막 교체 일뿐입니다.

결과를 동일한 변수에 다시 저장하도록 루프를 변경하십시오.

    for k, v in replace_chars.items():
        text = text.replace(k.decode('utf-8'), v)
        print('replacing ' + k.decode('utf-8') + ' with ' + v)
    return text