이번 편의 목표: 인덱스·슬라이스·문자열 메서드로 입력 문자를 정리합니다.

사람이 입력한 글자는 늘 가지런하지 않습니다. 앞뒤에 공백이 붙기도 하고, 쉼표로 묶인 항목이 한 문장으로 들어오기도 합니다. 문자열 처리는 이런 입력을 프로그램이 다루기 쉬운 모양으로 만드는 작업입니다.

글자의 위치는 0부터 센다

Python
title = "파이썬 기초"
print(title[0])
print(title[-1])
print(title[:3])
print(title[4:])
print(len(title))

raw = "  커피,4500  "
clean = raw.strip()
parts = clean.split(",")
print(parts)
print(" / ".join(parts))
print(clean.replace("커피", "차"))
print("report.csv".endswith(".csv"))
print("coffee".upper())
print(raw)

첫 글자 `title[0]`은 `파`, 마지막 글자 `title[-1]`은 `초`입니다. `title[:3]`은 0·1·2번 글자, 즉 `파이썬`입니다. 슬라이스의 끝 위치는 포함하지 않습니다. 공백도 글자이므로 `len(title)`은 `6`입니다.

없는 위치를 하나 지정하면 `IndexError`가 발생하지만, 슬라이스는 범위를 넘겨도 가능한 부분만 반환합니다. 빈 문자열에서 `text[0]`을 꺼내는 코드는 실패할 수 있습니다. 길이나 빈 값 여부를 확인하는 방법은 다음 편의 조건문과 연결됩니다.

메서드는 값에 붙여 쓰는 기능이다

`raw.strip()`은 앞뒤 공백을 없앤 새 문자열을 반환합니다. 원본 `raw`를 수정하지 않으므로 마지막 출력에는 여전히 공백이 있습니다. 바꾼 값을 계속 사용하려면 `raw = raw.strip()`처럼 다시 연결해야 합니다.

`split(",")`은 쉼표를 기준으로 나누어 목록을 만듭니다. 출력에 대괄호가 보이는 이유입니다. 이 목록의 자세한 조작은 9편에서 다룹니다. 지금은 `parts[0]`으로 항목, `parts[1]`로 금액 문자를 꺼낼 수 있다는 정도면 충분합니다.

`" / ".join(parts)`는 문자열 목록 사이에 구분자를 끼워 다시 연결합니다. 목록 안의 요소가 문자열이어야 합니다. `replace()`는 지정한 문자열을 바꾸고, `endswith()`는 특정 문자열로 끝나는지 `True` 또는 `False`로 알려 줍니다.

경계는 문법보다 데이터에 있다

쉼표가 들어간 모든 자료를 `split(",")`로 처리해도 될까요? 항목 이름이 `"커피, 차"`라면 구분용 쉼표와 내용의 쉼표가 충돌합니다. 실제 CSV 파일은 따옴표 규칙이 있으므로 18편에서 `csv` 모듈로 읽습니다. 간단한 문자열 분해와 파일 형식 해석은 구분해야 합니다.

문자열의 특정 글자를 `title[0] = "자"`처럼 바꾸는 것도 불가능합니다. 문자열은 변경 불가능한 자료형입니다. 필요한 부분을 합쳐 새 문자열을 만듭니다. 한글도 문자열로 처리할 수 있지만, 화면에 보이는 복합 이모지 한 개와 `len()`이 세는 길이가 항상 같지는 않습니다.

직접 해 보기

`" Python-Basic.TXT "`의 앞뒤 공백을 없애고 소문자로 바꾼 뒤, `-`를 `_`로 바꾸세요. 확장자가 `.txt`인지도 확인하세요.

해설

Python
filename = "  Python-Basic.TXT  "
filename = filename.strip().lower().replace("-", "_")
print(filename)
print(filename.endswith(".txt"))

결과는 `python_basic.txt`, `True`입니다. 메서드를 연결할 때는 앞 단계의 결과가 다음 단계의 입력이 된다고 읽으면 됩니다.