Published on

파이썬 문자열 공백 제거 strip 메서드로 양쪽 공백을 깔끔하게 없애는 법

Authors

서론

로그를 파싱하거나 CSV/텍스트 파일을 읽을 때, 눈에 보이지 않는 공백(스페이스, 탭, 개행) 하나 때문에 조건문이 실패하거나 키 매칭이 어긋나는 일이 자주 발생합니다. 예를 들어 "OK""OK\n"는 화면에 비슷해 보여도 파이썬에서는 전혀 다른 문자열이죠.

이 글에서는 파이썬 문자열 공백 제거의 표준 도구인 strip()을 중심으로, lstrip(), rstrip()의 차이, 공백이 아니라 특정 문자를 제거하는 방법, 그리고 실무에서 자주 만나는 함정과 해결책을 정리합니다.

strip이 정확히 하는 일

str.strip()문자열의 양쪽(왼쪽과 오른쪽) 끝에서 연속된 공백 문자들을 제거합니다. 여기서 중요한 포인트는 “중간 공백”은 건드리지 않는다는 점입니다.

s = "  hello   world  "
print(s.strip())
# 'hello   world'

strip이 제거하는 공백의 범위

기본 인자 없이 strip()을 호출하면, 파이썬이 “공백 문자(whitespace)”로 분류하는 것들을 제거합니다. 대표적으로:

  • 스페이스(' ')
  • 탭('\t')
  • 개행('\n')
  • 캐리지 리턴('\r')
s = "\t  hello\n"
print(repr(s.strip()))
# 'hello'

repr()로 출력하면 눈에 안 보이는 문자를 확인하기 좋습니다.

lstrip과 rstrip 언제 쓰나

  • lstrip() : 왼쪽(앞)만 제거
  • rstrip() : 오른쪽(뒤)만 제거
s = "  hello  "
print(repr(s.lstrip()))  # 'hello  '
print(repr(s.rstrip()))  # '  hello'

실무 팁: 줄 단위 입력에서는 rstrip이 더 안전할 때가 많다

파일에서 한 줄씩 읽으면 대부분 줄 끝에 \n이 붙습니다. 이때 앞쪽 공백(들여쓰기)을 보존해야 하는 데이터라면 strip()은 위험할 수 있고, rstrip()이 적절한 경우가 많습니다.

line = "    indented text\n"
print(repr(line.strip()))   # 'indented text'  (앞 공백이 날아감)
print(repr(line.rstrip()))  # '    indented text' (뒤 개행만 제거)

파일 입출력과 줄 처리 패턴은 with open을 함께 쓰면 더 안전합니다. 관련해서는 파이썬 with open 구문으로 파일을 안전하게 다루는 법 close 없이도 누수 없는 입출력도 같이 참고하면 좋습니다.

strip 인자에 문자열을 넣으면 공백이 아니라 “문자 집합”을 제거한다

strip(chars) 형태로 인자를 주면, 공백 제거가 아니라 “chars에 포함된 문자들”을 양쪽에서 제거합니다.

여기서 가장 흔한 오해는 “부분 문자열을 제거한다”라고 생각하는 것입니다. 실제로는 집합(set)처럼 동작합니다.

s = "---hello---"
print(s.strip("-"))
# 'hello'

함정: strip은 접두/접미 문자열을 정확히 제거하지 않는다

예를 들어 strip("ab")는 양끝에서 'a' 또는 'b'면 계속 제거합니다.

s = "ababaHELLOabab"
print(s.strip("ab"))
# 'HELLO'

이 동작이 의도와 다르면, 다음과 같은 대안을 고려하세요.

  • 파이썬 3.9+라면 removeprefix, removesuffix 사용
  • 정규식으로 명확한 패턴 제거
s = "prefix_value_suffix"
print(s.removeprefix("prefix_"))  # 'value_suffix'
print(s.removesuffix("_suffix"))  # 'prefix_value'

자주 겪는 트러블슈팅

1) 비교/조건문이 실패한다

status = "OK\n"
if status == "OK":
    print("success")
else:
    print("fail")
# fail

해결:

status = status.strip()
if status == "OK":
    print("success")

디버깅 팁:

print(repr(status))

2) split 결과에 빈 값이 섞인다

사용자 입력이나 로그에서 쉼표로 분리할 때, 양끝 공백 때문에 후처리가 늘어납니다.

raw = " apple, banana ,  cherry "
items = [x.strip() for x in raw.split(",")]
print(items)
# ['apple', 'banana', 'cherry']

이 패턴은 실무에서 매우 자주 쓰이니 기억해두면 좋습니다.

3) 파일에서 읽은 값의 개행 때문에 키 매칭이 깨진다

# 파일 한 줄이 'user123\n' 형태로 읽힘
user_id = line  # 'user123\n'
# dict의 키가 'user123'라면 조회 실패

해결:

user_id = line.rstrip("\n")

rstrip()"\n"만 지정하면, 오른쪽에서 개행만 제거하고 다른 공백은 유지할 수 있습니다.

Best Practice 정리

1) 입력값 정규화(normalization)를 초기에 하라

사용자 입력, 파일 입력, 외부 API 응답을 받는 순간에 정규화하면 뒤쪽 로직이 단순해집니다.

def normalize_text(s: str) -> str:
    return s.strip()

name = normalize_text(input("name: "))

2) strip을 남발하지 말고 목적에 맞게 선택하라

  • 줄 끝 개행만 제거: rstrip("\n")
  • 오른쪽 공백만 제거: rstrip()
  • 앞 공백이 의미가 있는 데이터(들여쓰기, 정렬된 컬럼): strip() 지양

3) 공백 제거 후 대소문자 처리까지 함께 고려하라

실무에서는 공백 제거와 함께 대소문자 통일이 같이 필요할 때가 많습니다.

cmd = "  Start  "
cmd = cmd.strip().lower()
print(cmd)  # 'start'

대소문자 변환이 헷갈린다면 파이썬 문자열 대소문자 변환 실무 가이드 upper lower capitalize 제대로 쓰는 법도 같이 보면 입력 정규화 파이프라인을 더 깔끔하게 만들 수 있습니다.

결론

  • strip()은 문자열 양쪽 끝의 공백 문자를 제거하며, 중간 공백은 유지합니다.
  • lstrip()/rstrip()은 각각 왼쪽/오른쪽만 제거하므로, 파일 줄 처리나 들여쓰기 보존 같은 상황에서 더 안전합니다.
  • strip(chars)는 “부분 문자열 제거”가 아니라 지정한 문자 집합을 양끝에서 제거한다는 점이 핵심 함정입니다.
  • 실무에서는 입력을 받는 즉시 strip()(또는 목적에 맞는 rstrip)으로 정규화하면 비교/매칭/파싱 버그를 크게 줄일 수 있습니다.