HOWTO · Python
Python에서 문자열의 문자 바꾸기
Python 문자열에서 위치를 지정해 문자 하나를 바꾸거나 일치하는 문자를 바꾸는 방법을 알아봅니다.
이 페이지의 내용
Python 문자열은 불변이므로 기존 문자열의 문자를 직접 새 문자로 대입할 수 없습니다. 대신 값을 바꾼 새 문자열을 만들어야 합니다. 한 위치의 문자를 바꾸려면 리스트를 사용하고, 일치하는 텍스트를 바꾸려면 replace()를 사용하며, 위치를 알고 있다면 슬라이싱을 사용할 수 있습니다. bytearray()는 ASCII 같은 바이트 기반 데이터에 적합하지만, 인덱스가 일반적인 유니코드 문자가 아닌 바이트를 가리킵니다.
문자열의 문자를 바꾸기 위해 list()와 join() 사용하기
내장 함수 list()로 문자열을 변환한 다음, 0부터 시작하는 인덱스 위치에 대체 문자를 대입하고 문자들을 다시 하나로 합칩니다. 리스트 항목을 결합하려면 구분자 문자열에 join()을 호출합니다. ""을 사용하면 구분자가 들어가지 않습니다. 예를 들어 인덱스 2는 세 번째 문자를 가리킵니다.
text = "Naze"
characters = list(text)
characters[2] = "m"
updated = "".join(characters)
print(updated)
Name
이 방법은 한 위치의 문자만 바꾸며 원래 문자열 값은 그대로 둡니다. updated는 새로 결합한 텍스트를 가리킵니다. 인덱스는 리스트의 항목을 가리켜야 하므로, 사용자 입력으로 위치를 받는다면 문자열의 길이를 확인하세요.
문자열의 문자를 바꾸기 위해 bytearray() 사용하기
바이트 기반 텍스트를 다룰 때는 먼저 문자열을 인코딩하고, 변경 가능한 bytearray()에서 정수 바이트 값을 대입한 다음, 바이트를 다시 디코딩해 문자열을 얻습니다. 아래 예제는 표시된 각 문자가 1바이트로 표현되는 ASCII를 사용합니다.
text = "Naze"
data = bytearray(text, "ascii")
data[2] = ord("m")
updated = data.decode("ascii")
print(updated)
Name
인코딩과 디코딩에는 서로 호환되는 문자 인코딩을 사용해야 합니다. 바이트 인덱스가 유니코드 문자 인덱스와 항상 일치하는 것은 아닙니다. ASCII 범위를 벗어나는 문자는 UTF-8에서 여러 바이트를 차지할 수 있습니다. 데이터의 인코딩과 바이트 위치를 직접 다뤄야 할 때만 이 방법을 사용하고, 일반 텍스트에는 문자열 기반 방법을 사용하세요.
문자열에서 일치하는 문자를 바꾸기 위해 replace() 메서드 사용하기
기존 텍스트와 새 텍스트를 인수로 전달해 문자열 메서드 replace()를 호출합니다. 기본적으로 겹치지 않는 모든 기존 텍스트를 바꾸고 결과를 새 문자열로 반환합니다.
text = "Naze"
updated = text.replace("z", "m")
print(updated)
Name
원래 text는 변경되지 않습니다. 바꿀 일치 항목 수를 제한하려면 선택 사항인 세 번째 인수에 개수를 전달하세요. 예를 들면 text.replace("a", "o", 1)과 같습니다. 기존 텍스트가 없다면 replace()는 변경되지 않은 문자열을 반환합니다. 이를 통해 철자 불일치와 대입 문제를 구분할 수 있습니다.
알려진 위치의 문자를 바꾸기 위해 슬라이싱과 연결 사용하기
0부터 시작하는 위치를 알고 있다면 그 앞의 접두 부분을 가져오고, 대체 문자를 더한 뒤, 그 문자 다음의 접미 부분을 이어 붙입니다. text[:2] 슬라이스는 인덱스 2 앞의 위치들을 유지하고, text[3:]은 해당 문자 다음부터 시작합니다.
text = "Naze"
updated = text[:2] + "m" + text[3:]
print(updated)
Name
이 방법은 앞뒤 접두 부분과 접미 부분을 보존하면서 새 문자열을 만듭니다. 접미 부분이 바꾸려는 문자보다 한 위치 뒤에서 시작하는지 확인하세요. 인덱스를 잘못 지정하면 문자가 빠지거나 중복될 수 있습니다. 위치가 이미 알려져 있고 이 표현식이 용도에 맞게 명확할 때 사용하세요. 여기서는 속도를 비교하지 않습니다.