14 minute read

Python 의 고급 문자열 기능에 대해서 알아보도록 하겠습니다. 저는 Python 이 CJava 등에 비해 비교적 쉬운 언어라 Python 의 문법들이나 기법들에 대해서 주의 깊게 다루지 않아 자주 쓰던 것들도 까먹고 하는 문제가 있습니다. 거기다 최근에 다시 시작한 딥러닝 공부를 하면서 제 자신이 Python 에 대해서 많이 부족하다는 것을 깨달아 이를 보완하고자 블로그에 제가 공부한 것을 기록하면서 추후에 제가 또 까먹거나 필요할 때 바로 바로 볼 수 있고, 또 정리를 하면서도 공부가 된다고 하여 이렇게 블로그 정리를 해보고자 합니다. 이번엔 Python 문자열의 고급 기능들에 대해서 알아보고 정리해 보도록 하겠습니다. 이 포스트는 브라이언 오버랜드, 존 베냇 저자 파이썬 스킬업 이라는 책에 있는 내용을 토대로 작성하였으며, 책 내용 중 제가 필요하다고 생각되는 부분만 가져왔습니다.

1. 문자열 연산자(+, =, *, >, etc)

Python 의 문자열 타입 str에서 숫자 타입 연산자와 같은 연산자를 사용할 수 있습니다만, 다르게 동작합니다. 문자열에서 사용하는 연산자에 대해서 알아보고 어떻게 동작하는지 예시로 한 번 알아보도록 하겠습니다.

연산자 문법 설명
value = 문자열 문자열을 변수에 대입한다
문자열1 == 문자열2 문자열1과 문자열2가 같은 값을 가지고 있다면 True 를 반환한다 (다른 비교 연산자들과 같이 대소문자를 구분한다)
문자열1 != 문자열2 문자열1과 문자열2가 서로 다른 값을 가지고 있다면 True 를 반환한다
문자열1 < 문자열2 문자열1이 문자열2보다 알파벳 순서가 앞이면 True 를 반환한다. 가령 ‘abc’ < ‘def’ 는 True 를 반환하지만 ‘abc’ < ‘aaa’ 는 False 를 반환한다
문자열1 > 문자열2 문자열1이 문자열2보다 알파벳 순서가 뒤면 True 를 반환한다.
문자열1 <= 문자열2 문자열1이 문자열2보다 알파벳 순서가 앞이거나 같다면 True 를 반환한다.
문자열1 >= 문자열2 문자열1이 문자열2보다 알파벳 순서가 뒤거나 같다면 True 를 반환한다.
문자열1 + 문자열2 두 문자열을 연결한다. 문자열1 끝에 문자열2를 붙인다.
문자열1 * n 문자열1을 정수 n만큼 반복하여 연결한다.
문자열1 in 문자열2 문자열1 전체가 문자열2에 포함되면 True 를 반환한다.
문자열1 not in 문자열2 문자열1 전체가 문자열2에 포함되지 않으면 True 를 반환한다.
문자열 is 객체 문자열과 객체가 메모리상에 동일 객체를 참조하고 있으면 True 를 반환한다. 간혹 None 이나 알지 못하는 객체 타입과 비교할 때 사용된다
문자열 is not 객체 문자열과 객체가 메모리상에 동일 객체를 참조하고 있지 않으면 True 를 반환한다.

# 1. 변수에 문자열 대입
value = '안녕하세요'
print(value) # 안녕하세요

# 2. 문자열 비교

# 동등 비교 문자열1 == 문자열2

a = "Python"
b = "Python"
c = "python"

print(a == b)  # True  : 값(내용)이 같으면 True (대소문자 구분)
print(a == c)  # False : 대소문자 다름
print("가나다" == "가나다")  # True : 한글도 유니코드 코드포인트 기준으로 비교

# 부등 비교: 문자열1 != 문자열2

print("abc" != "ABC")  # True  : 대소문자 다르면 True
print("123" != "0123") # True  : 길이나 문자 하나라도 다르면 True

# 사전식 비교(유니코드 순): >, >=, >, >=

# '<' 예시
print("abc" < "def")   # True  : 'a' < 'd'
print("abc" < "aaa")   # False : 'abc' vs 'aaa' -> 첫 글자 'a'는 같고, 두 번째 'b' > 'a' 이므로 False
print("Z"   < "a")     # True  : 'Z'(90) < 'a'(97)  ※ 아스키/유니코드 값 기준

# '>' 예시
print("홍길동" > "가나다")  # True  : '홍'이 '가'보다 코드포인트가 큼
print("Python" > "Java")    # True  : 'P' > 'J'

# '<=' '>=' 예시
print("abc" <= "abc")  # True  : 같으면 <=, >= 비교는 True
print("ab"  <= "abc")  # True  : 'ab'는 'abc'보다 사전식으로 앞섬

# 3. 문자열 연결: 문자열1 + 문자열2

first = '윌리엄'
last = '셰익스피어'
full_name = first + ' ' + last
print(full_name) # 윌리엄 셰익스피어

# 4. 반복: 문자열 * n

print("ha" * 3)  # "hahaha"
print("-"  * 10) # "----------"
print("abc" * 0) # "" (빈 문자열)

# 5. 포함 여부: 문자열1 in 문자열2

text = "파이썬은 재미있다!"
print("파이" in text)     # True  : 부분 문자열 포함
print("python" in text)  # False : 대소문자/언어 다르면 당연히 False

# 대소문자 무시하고 포함 확인하고 싶다면 둘 다 소문자/대문자로 통일
print("python" in "Python is fun".lower())  # True

# 6. 미포함 여부

lang = "Python"
print("JS"  not in lang)  # True
print("Py"  not in lang)  # False : "Py"는 "Python"에 포함됨

# 7. 객체 동일성 비교: is, is not

# 올바른 사용: None과 비교할 때
result = None
print(result is None)      # True
print(result is not None)  # False

# 잘못 쓰기 쉬운 패턴: 문자열 동등성에 is 사용 (지양!)
s1 = "abc"
s2 = "ab" + "c"            # 상수 폴딩으로 같은 객체가 될 수도 있음(파이썬 구현/상황에 따라 다름)
s3 = "".join(["ab", "c"])  # 런타임에 만들어져 보통은 다른 객체

print(s1 == s2)  # True  : 값이 같음
print(s1 is s2)  # (환경 따라 True/False) '우연히' True가 나올 수도 있어 의존하면 안 됨
print(s1 == s3)  # True  : 값이 같음
print(s1 is s3)  # 보통 False : 서로 다른 객체

# 'is'는 오직 "같은 객체인가?"를 물을 때만 사용
sentinel = object()
alias = sentinel
print(sentinel is alias)    # True  : 같은 객체를 가리킴
print(id(sentinel), id(alias))  # 객체 식별자(메모리 주소 유사값)도 동일

참고로 Python 에서 문자열을 비교할 때 알파벳 순서를 사용합니다. 좀 더 구체적으로 말하자면 문자 값의 아스키코드나 유니코드의 코드 순서를 따릅니다. 이렇게 하면 모든 대문자는 소문자보다 앞에 위치하며, 이 규칙 이외에는 문자들을 단순히 알파벳 순서로 비교할 수 있습니다. 그리고 문자열 비교를 할 때 광범위한 유니코드 문자로 이루어진 문자열을 사용하고 있다면 casefold 메서드를 사용해 대소문자를 구분하지 않고 값을 비교하는 것이 더 안전합니다.

def compare_no_case(str1, str2):
	return str1.casefold() == str2.casefold()

print(compare_no_case('cat', 'CAT')) # True 값 반환

2. join 을 사용하여 문자열 만들기

우리는 + 를 이용해 문자열을 연결하는 방법에 대해서 알게 되었습니다. 하지만 이 경우 적은 숫자의 객체를 다루는 단순한 경우에는 효과가 좋지만 많이 반복할 경우 문자열 연산을 하기 위해 새로운 문자열 객체를 생성하게 되므로 메모리 누수가 일어나게 됩니다. 이러한 문제를 해결하기 위해서 join 을 사용합니다.

구분자_문자열.join(리스트)

join 은 리스트의 모든 문자열을 하나의 커다란 문자열로 만듭니다. 단순 문자열 연결하기 대신 join 을 사용하면서 얻는 이점은 수천 번 연산해야 하는 큰 사례에서 확인할 수 있습니다. 이런 사례에서 문자열 연결하기가 갖는 결점은 한 번만 사용하고 파이썬의 “가비지 컬렉션(garbage collection)”에 의해 버려질 수천 개의 문자열을 만들어야 한다는 것입니다. 그리고 빈번하게 실행된 가비지 컬렉션은 실행 시간의 비효율을 초래합니다. 아래 예시는 join 을 이용하면 아주 간단히 작업할 수 있는 것을 볼 수 있습니다.


str_array = ['John', 'Paul', 'George', 'Ringo']

def print_worse(a_lst):
	s = ''
	for item in a_lst:
		s += item + ', '
	if len(s) > 0: # 문자열 끝의 콤바 + 빈칸 제거
		s = s[:-2]
	print(s)

def print_nice(a_lst):
	print(', '.join(a_lst))
 
print_worse(str_array) # John, Paul, George, Ringo
print_nice(str_array) # John, Paul, George, Ringo

3. 주요 문자열 메서드

Python 에서는 문자열 타입에 사용할 수 있는 기본 내장 함수를 제공합니다. 이 내장 함수들은 자주 사용되기 때문에 알아두고 있으면 유용합니다.

메서드 설명
input(프롬프트에 출력한 문자열) 문자열 입력을 위한 프롬프트 사용자
len(문자열) 문자열 내 문자 개수를 숫자로 반환
max(문자열) 가장 높은 코드(유니코드) 값을 가진 문자 반환, 빈 문자열에서 ValueError 발생
min(문자열) 가장 낮은 코드(유니코드) 값을 가진 문자 반환, ValueError 발생
reversed(문자열) 역순으로 항목을 내주는 이터레이터
sorted(문자열) 정렬된 문자들의 리스트를 반환

# 1. input()

# 콘솔에서 한 줄을 입력받아 str 로 반환합니다.
name = input("이름을 입력하세요: ")  # 예: 사용자가 '철수' 입력
print(type(name))          # <class 'str'>
print(f"안녕하세요, {name}님!")  # 안녕하세요, 철수님!

# 숫자를 받고 싶다면 형 변환을 해야 합니다.
age = int(input("나이를 입력하세요: "))  # '27' 입력 시 27(int)로 변환
print(f"내년에는 {age + 1}살!") # 내년에는 28살!


# 2. len()

s1 = "Python"
s2 = "파이썬"

print(len(s1))  # 6
print(len(s2))  # 3

# 3. max() / min()

t = "aZ3가"

print(max(t))  # '가'  : 유니코드 코드 포인트가 가장 큼
print(min(t))  # '3'   : 코드 포인트가 가장 작음

# 비교가 유니코드 코드 포인트 기반임을 확인
print(ord('a'), ord('Z'), ord('3'), ord('가'))  # 각 문자 -> 정수 코드값

# 빈 문자열은 에러: ValueError
empty = ""
# max(empty)  # ValueError
# 방어적으로 default 사용 (파이썬 3.4+)
print(max(empty, default=None))  # None


# 4. reversed()

s = "ABCDE"

rv = reversed(s)
print(rv)                   # <reversed object ...>  ← 역순 '문자'를 내주는 이터레이터

print(list(rv))             # ['E', 'D', 'C', 'B', 'A']  ← 한 번 소비하면 비워집니다

# 역순 문자열을 얻고 싶다면 join 또는 슬라이싱을 사용
s_rev = "".join(reversed(s))
print(s_rev)                # "EDCBA"

# 파이썬 관용구: 슬라이싱으로 뒤집기
print(s[::-1])              # "EDCBA"


# 5. sorted()

s = "baCA가1"

print(sorted(s))                   # ['1', 'A', 'C', 'a', 'b', '가'] (유니코드 코드값 오름차순)
print("".join(sorted(s)))          # "1ACab가"  ← 문자열로 합치기

# 내림차순
print("".join(sorted(s, reverse=True)))  # '가baCA1'

# 대소문자 무시 정렬
print("".join(sorted(s, key=str.lower))) # 'aAbC1가' (소문자로 변환한 값 기준)

4. 간단한 is 메서드

메서드의 이름이 is로 시작하는 모든 메서드는 TrueFalse 를 반환합니다. 간혹 문자열의 어떤 특성을 이용하고자 할 때 is 가 들어간 메서드를 활용해야합니다. 이 메서드들을 표로 한 번 정리해 보았습니다.

메서드 이름 테스트 통과 시 True 반환
str.isalnum() 모든 문자가 글자와 숫자로 이루어졌으며, 최소한 문자가 하나 이상 있는 경우
str.isalpha() 모든 문자가 알파벳 글자로 이루어졌으며, 최소한 문자가 하나 이상 있는 경우
str.isdecimal() 모든 문자가 10진수 숫자로 이루어졌으며, 최소한 문자가 하나 이상 있는 경우, 유니코드를 사용함
str.isdigit() 모든 문자가 10진수 숫자로 이루어졌으며, 최소한 문자가 하나 이상 있는 경우
str.isidentifier() 문자열이 유효한 파이썬 식별자 이름 규칙을 지키고 있는 경우, 첫 문자는 반드시 문자가 언더스코어(_)여야하며, 각 문자는 글자, 숫자 혹은 언더스코이어야 한다.
str.islower() 모든 문자가 소문자로 이루어졌으며, 최소한 문자가 하나 이상 있는 경우(참고로 알파벳이 아닌 문자가 포함될 수도 있다)
str.isprintable() 모든 문자가 출력 가능한 문자인 경우, \n\t 는 제외
str.isspace() 모든 문자가 공백 문자(whitespace)이며, 최소한 문자가 하나 이상 있는 경우
str.istitle() 모든 문자가 유효한 제목이며, 최소한 문자가 하나 이상 있는 경우, 첫 문자만 대문자고 나머지는 모두 소문자면 조건에 만족한다. 문자 사이에 공백 문자가 구분 문자가 있을 수 있다.
str.isupper() 모든 문자가 대문자로 이루어졌으며 최소한 문자가 하나 이상 있는 경우(참고로 알파벳이 아닌 문자가 포함될 수도 있다)
# 1. str.isalnum() - 영문자/한글/숫자만으로 구성

print("abc123".isalnum())     # => True
print("한글ABC123".isalnum())  # => True (한글/라틴/숫자 혼합 가능)
print("abc_123".isalnum())    # => False ('_'는 영숫자 아님)
print("".isalnum())           # => False (빈 문자열)

# 2. str.isalpha() - 알파벳만으로 구성

print("Python".isalpha())     # => True
print("한글ABC".isalpha())     # => True
print("abc123".isalpha())     # => False (숫자 포함)
print("abc!".isalpha())       # => False (! 포함)
print("".isalpha())           # => False

# 3. str.isdecimal() - 10진 숫자(유니코드) 만으로 구성

print("123456".isdecimal())   # => True
print("45".isdecimal())      # => True (전각 숫자)
print("²".isdecimal())         # => False (제곱 표기: 2의 윗첨자)
print("一二三".isdecimal())     # => False (한자 숫자)
print("".isdecimal())          # => False

# 4. str.isdigit() - 숫자(윗첨자 등 일부 숫자 기호 포함)만으로 구성

print("123".isdigit())        # => True
print("²³".isdigit())         # => True (윗첨자 2,3 — isdecimal은 False)
print("①②".isdigit())         # => True 또는 False (플랫폼/버전에 따라 다를 수 있음)
print("一二三".isdigit())       # => False (한자 숫자는 isnumeric()에서 True)
print("12a".isdigit())        # => False
print("".isdigit())           # => False

# 5. str.isidentifier() - 파이썬 식별자로 유효한가?

print("variable".isidentifier())   # => True
print("_hidden".isidentifier())    # => True
print("변수".isidentifier())        # => True (유니코드 문자 가능)
print("3cats".isidentifier())      # => False (숫자로 시작 불가)
print("class".isidentifier())      # => True (키워드인지 여부는 별개)
# 키워드 여부는 keyword 모듈로 확인 가능:
#   import keyword; print(keyword.iskeyword("class"))  # True

# 6. str.islower() - 소문자만 포함

print("python".islower())     # => True
print("python!".islower())    # => True ('!'는 비문자)
print("Python".islower())     # => False
print("123".islower())        # => False (cased 문자가 없음)
print("ß".islower())          # => True (독일어 ß는 소문자)

# 7. str.isprintable() - 모든 문자가 출력 가능?

print("Hello, World!".isprintable())  # => True
print("공백 포함 ".isprintable())       # => True (스페이스는 출력 가능)
print("\n".isprintable())             # => False (제어 문자)
print("".isprintable())               # => True (빈 문자열은 True)

# 8. str.isspace() - 모두 공백 문자(스페이스/탭/개행 등)

print("   ".isspace())       # => True (스페이스만)
print("\t\n\r".isspace())    # => True (탭/개행/캐리지리턴)
print(" \u2003 ".isspace())  # => True (em-space 등 유니코드 공백)
print(" a ".isspace())       # => False (문자 포함)
print("".isspace())          # => False (빈 문자열)

# 9. str.istitle() - 각 단어가 제목 표기(첫 글자 대문자, 나머지 소문자)

print("Hello World".istitle())        # => True
print("Hello, World!".istitle())      # => True (구두점은 무시)
print("This Is A Title".istitle())    # => True
print("Hello 42Nd Street".istitle())  # => True (숫자 뒤 'Nd'는 제목 표기로 간주)
print("hello World".istitle())        # => False (첫 단어 소문자)


# 10. str.isupper() - 대문자만 포함

print("PYTHON".isupper())     # => True
print("PYTHON!".isupper())    # => True ('!'는 비문자)
print("PYTHON3".isupper())    # => True (숫자는 영향 없음)
print("PyTHON".isupper())     # => False (소문자 포함)
print("123".isupper())        # => False (cased 문자가 없음)

5. 대소문자 변환 메서드

문자열을 이용한 작업을 처리하다보면 대문자 혹은 소문자로 통일해서 처리해야 하는 경우가 잦습니다. 대소문자 변환 메서드와 함께 추가로 쓰이는 메서드도 함께 알아보도록 하겠습니다.

메서드 이름 설명
문자열.lower() 모두 소문자인 문자열을 생성한다.
문자열.upper() 모두 대문자인 문자열을 생성한다.
문자열.title() 문자열의 각 단어 첫 글자를 대문자로, 나머지를 소문자로 바꾼 문자열을 생성한다.
문자열.swapcase() 대소문자를 서로 변경한 문자열을 생성한다.

Python 의 문자열은 변하지 않는 타입입니다. 그래서 위 메서드들은 변환된 새로운 문자열을 생성해줍니다. 다만 변환된 새로운 객체를 기존 객체에 대입해 주기 때문에 변경된 것으로 보입니다.

# 1. 문자열.lower() 대문자를 소문자로 변환

s = "PyTHON 3.12! 한글 OK"
print(s.lower())     # => "python 3.12! 한글 ok" (한글은 케이스 개념이 없어 그대로)
print("ß".lower())   # => "ß" (더 강한 무케이스 비교가 필요하면 .casefold() 권장)

# 2. 문자열.upper() - 소문자를 대문자로 변환

s = "Hello, world! 123 한글"
print(s.upper())     # => "HELLO, WORLD! 123 한글"

# 3. 문자열.title() - 각 단어의 첫 글자를 대문자로, 나머지는 소문자로

print("hello world".title())                       # => "Hello World"
print("they're bill's friends from the UK".title())# => "They'Re Bill'S Friends From The Uk"
# ※ 아포스트로피를 단어 경계로 취급해 위처럼 보일 수 있음


# 4. 문자열.swapcase() - 대소문자 뒤집기

print("Python3 iS FUN!".swapcase())  # => "pYTHON3 Is fun!"
# 유니코드 전반에서는 swapcase를 두 번 적용해도 원문이 100% 보장되지는 않습니다.

6. 검색-교체 메서드

검색-교체 메서드는 문자열 메서드 중에서 유용해서 많이 사용됩니다. 그러므로 문자열의 검색-교체 메서드들을 알고 있는 것이 좋습니다. 아래는 자주 사용되는 검색-교체 메서드들을 표로 정리한 것입니다.

메서드 이름 반환값 설명
startswith(prefix[, start[, end]]) bool 문자열이 prefix시작하면 True. prefix튜플도 가능. start/end는 슬라이스 규칙(s[start:end])으로 해석.
endswith(suffix[, start[, end]]) bool 문자열이 suffix끝나면 True. suffix튜플도 가능. start/end 지원(슬라이스와 동일).
count(sub[, start[, end]]) int (겹치지 않는) sub의 출현 횟수. 빈 문자열이면 len(s)+1. 범위 지정은 슬라이스 규칙.
find(sub[, start[, end]]) int 가장 왼쪽(낮은 인덱스)의 위치를 반환, 없으면 -1. 범위 지정은 슬라이스 규칙.
index(sub[, start[, end]]) int find()와 동일하지만, 없으면 ValueError 발생.
rfind(sub[, start[, end]]) int 가장 오른쪽(높은 인덱스)의 위치를 반환, 없으면 -1.
rindex(sub[, start[, end]]) int rfind()와 동일하지만, 없으면 ValueError 발생.
replace(old, new[, count]) str oldnew치환복사본 반환. count를 주면 그 횟수만큼만 치환. (미지정 또는 -1이면 모두)
s = "abc_abc-XYZ.txt"

# 1. startswith / endswith
print(s.startswith("abc"))                 # True
print(s.endswith(".txt"))                  # True
print(s.startswith(("def", "abc")))        # True (튜플 허용)
print(s.endswith((".csv", ".txt"), 0, 11)) # False: s[0:11] 범위에서는 ".txt"가 없음

# 2. count (겹치지 않는 출현만 카운트)
print("ababa".count("aba"))   # 1
print("ababa".count("ba"))    # 2
print("abc".count(""))        # 4 (len(s)+1)

# 3. find / index
print(s.find("abc"))          # 0
print(s.find("XYZ"))          # 8
print(s.find("nope"))         # -1
# print(s.index("nope"))      # ValueError (없으면 예외)

# 4. rfind / rindex
print(s.rfind("abc"))         # 4 (오른쪽에서 가장 가까운 위치)
# print(s.rindex("nope"))     # ValueError

# 5. replace
print(s.replace("abc", "###"))        # "###_###-XYZ.txt"
print(s.replace("abc", "###", 1))     # "###_abc-XYZ.txt" (한 번만)

7. split 을 활용한 문자열 쪼개기

입력받은 문자열을 다루는 가장 흔한 프로그래밍 작업은 토큰화(tokenizing)입니다. 파이썬의 split 메서드는 토큰화 작업을 쉽고 편리하게 할 수 있도록 도와줍니다. split 메소드의 구성은 다음과 같습니다.

문자열.split(구분_문자열=None)

알아볼 예제는 split 메서드의 다양한 활용법에 대해서 알아보도록 하겠습니다.


# 1. 구분 문자열이 생략되거나 None 이면 공백 문자(빈칸, 탭, 개행 문자)를 기준으로 분리한다.

stooge_list = 'Moe Larry Curly Shemp'.split()
print(stooge_list) # ['Moe', 'Larry', 'Curly', 'Shemp']

# 2. None 혹은 기본 인자로 split 수행 시 공백 문자의 개수는 상관 없다.

stooge_list = 'Moe    Larry    Curly    Shemp'.split()
print(stooge_list) # ['Moe', 'Larry', 'Curly', 'Shemp']

# 3. 구분 문자열이 명시 되면 구분자에 의해서 정확하게 구분되어야 한다.

stooge_list = 'Moe    Larry    Curly    Shemp'.split(' ')
print(stooge_list) # ['Moe', '', '', '', 'Larry', '', '', '', 'Curly', '', '', '', 'Shemp']

8. 앞뒤 문자 제거하기

사용자나 텍스트 파일로부터 문자열을 입력받으면 앞뒤에 붙은 빈칸 혹은 개행을 제거하여 원하는 형태로 변경해야 할 경우가 있습니다. 혹은 문자열을 앞뒤로 감싸고 있는 숫자나 다른 문자를 제거해야 하는 경우도 있습니다. Python 의 str 은 이렇게 앞뒤 문자를 제거하는 몇 가지 메서드를 제공합니다.

메서드 이름 설명
문자열.strip(제거문자열=’ ‘) 앞뒤 문자 지우기
문자열.lstrip(제거문자열=’ ‘) 앞 문자 지우기
문자열.rstrip(제거문자열=’ ‘) 뒤 문자 지우기

특히 rstrip 메서드의 경우 코딩 테스트를 Python 으로 진행할 경우 입력의 개행을 지우기 위해 굉장히 많이 사용됩니다.


# 1. 문자열.strip() - 앞/뒤 모두에서 제거

# 1) 기본: 공백류(스페이스, 탭, 개행 등) 제거
s = " \t  Hello World \n"
print(s.strip())     # => "Hello World"

# 2) 지정한 문자들의 '집합'을 양끝에서 제거 (가운데는 그대로)
s = "***--Hello--***"
print(s.strip("*-")) # => "Hello"  (* 또는 - 를 끝에서 계속 깎아냄)

# 3) 경로 꼬리 슬래시 제거 예
path = "///usr/local///"
print(path.strip("/"))  # => "usr/local"

# 4) '집합'이라는 점 주의: "abc" 전체가 아니라 a/b/c 각각을 의미
s = "abcabcXYZcab"
print(s.strip("abc"))   # => "XYZ"  (양끝에서 a/b/c 문자들을 제거한 뒤 멈춤)

# 5) 유니코드 공백도 제거 (NBSP, EM SPACE 등)
u = "\u00A0Hello\u2003"
print(u.strip())        # => "Hello"


# 2. 문자열.lstrip() - 앞(왼쪽)만 제거

# 앞쪽 공백 제거
s = "   [DATA]"
print(s.lstrip())       # => "[DATA]"

# 앞쪽의 '0'들만 제거 (숫자 포맷 정리 등에 유용)
num = "000123.4500"
print(num.lstrip("0"))  # => "123.4500"  (앞의 0만)

# 지정 문자 집합 예시
token = ">>>INFO>>> message"
print(token.lstrip("><I NFO"))  # => "> message"
# (왼쪽에서 >, <, I, 공백, N, F, O 중에 있는 문자를 계속 제거)

# 3. 문자열.rstrip() - 뒤(오른쪽)만 제거

# 뒤쪽 공백/개행 제거
line = "result=42   \n"
print(line.rstrip())         # => "result=42"

# 뒤쪽의 '0'들만 제거 (소수점 0 꼬리 자르기)
num = "000123.4500"
print(num.rstrip("0"))       # => "000123.45"

# 로그 꼬리 마커 제거
log = "status:OK;;;;"
print(log.rstrip(";:"))      # => "status:OK"

마치며

Python 의 문자열의 고급 기능들에 대해서 알아보았습니다. 평소 많이 쓰던 것들도 많았지만, 자주 접해보지 못했던 메서드들에 대해서 알아보고, 예제를 통해서 구체적으로 어떻게 사용되는지도 알아보았습니다. 긴 글 읽어주셔서 감사드리며, 내용 중 잘못된 내용, 오타 혹은 궁금한 내용이 있으시다면 댓글 달아주시기 바랍니다.

Tags:

Categories:

Updated:

Comments