python snippets

Python으로 문자 일괄치환

Snowyegret 2023. 9. 30. 13:18

 

1. 전각 -> 반각 (unicodedata 이용)

import unicodedata

def full_to_half(text):
    return unicodedata.normalize('NFKC', text)

print(full_to_half('Cエリア25番出口に出る!'))

일반적으로 전각 -> 반각을 하고싶은 경우, unicodedata.nomalize를 사용하면 된다.

 

 

 

2. 전각 -> 반각 (문자열 범위 및 maketrans 이용)

def full_to_half(text):
    table = str.maketrans({chr(0xFF01 + i): chr(0x21 + i) for i in range(94)})
    return text.translate(table)

print(full_to_half('Cエリア25番出口に出る!'))

Unicode 범위를 이용한 방법이다.

1번 및 3번 방법이 있어서 사용하지 않는다.

범위 지정이 가능하단 게 장점이다.

 

 

3. 테이블 이용

def full_to_half(text):
    global data_table
    table = str.maketrans(data_table)
    return text.translate(table)

with open('table.txt', 'r', encoding="utf-8") as f:
    data = f.read().splitlines()
    data_table = {i[0]: i[-1] for i in data}

print(full_to_half('Cエリア25番出口に出る!'))

단순히 전각 -> 반각을 하는 것이 아닌, 특정 문자를 다른 특정 문자로 대체하고 싶은 경우

일반적으로 replace 메서드를 사용해야 하는데,

여러개를 치환해야 하는 경우 .replace().replace().replace()...를 반복하여 사용해야 하거나

이를 반복문으로 구현해야 한다는 문제점이 있다.

 

2번에서도 나왔지만, 이를 해결 가능한 방법이 str.maketrans 및 .translate이다.

테이블을 불러와 딕셔너리를 만들고, 이를 maketrans 및 translate에 사용하면 된다.

 

Shift-JIS나 커스텀 테이블을 사용하여 제작되는 예전 고전게임의 경우 이 방법을 주로 사용하였다.

 

 

 

def full_to_half(text):
    global half_table, full_table
    table = str.maketrans(full_table, half_table)
    return text.translate(table)

with open('table.txt', 'r', encoding="utf-8") as f:
    data = f.read().splitlines()
    half_table = "".join([i[0] for i in data])
    full_table = "".join([i[-1] for i in data])

print(full_to_half('Cエリア25番出口に出る!'))

half_table = "12345"

full_table = "12345"

이런 식으로 str을 넣어도 된다.