파이썬 문자열 메서드 다루기

파이썬 문자열 메서드 다루기

문자열 메서드(String methods)

파이썬에서는 텍스트의 집합을 문자열(string)이라고 부르고, 그 문자열을 조작하기 위해 사용되는 특별한 기능들을 문자열 메서드(string methods)라고 부른다. 대표적인 문자열 메서드로는 문자열을 소문자에서 대문자로 바꿔준다던지, 시작점에 위치한 공백을 끝으로 옮긴다던지, 혹은 특정 텍스트 부분을 다른 텍스트로 대체하는 등의 메서드가 있다. 물론 이외에도 다른 수 많은 메서드가 존재한다.


대소문자 변경

문자열을 모두 소문자로 바꾸고 싶다면 lower() 메서드를 사용할 수 있다.

>>> "Jean-luc Picard".lower()
'jean-luc picard'

점(.)은 뒤에 오는 것이 메서드의 이름임을 파이썬에게 알려준다. 문자열 메서드는 스트링 리터럴 뿐만 아니라 변수에 할당된 문자열에도 사용될 수 있다.

>>> name = "Jean-luc Picard"
>>> name.lower()
'jean-luc picard'

lower() 메서드의 반대인 upper() 메서드를 사용하면 문자열 안의 모든 문자를 대문자로 변경할 수 있다.

>>> loud_voice = "Can you hear me yet?"
>>> loud_voice.upper()
'CAN YOU HEAR ME YET?'

upper() 메서드나 lower() 메서드는 len()과 같은 함수처럼 독립적으로 사용 될 수 있는 메서드가 아니므로 문자열과 같이 사용되어야 한다.

>>> len(loud_voice)
20

문자열 공백 제거하기

파이썬에서 공백은 빈 칸으로 출력된다. 특정 자리에 위치한 공백을 지우기 위해서 파이썬에서는 또 다른 문자열 메서드를 지원한다.

공백을 지우는 세 개의 문자열 메서드는 다음과 같다.
  1. rstrip()
  2. lstrip()
  3. strip()

rstrip()

rstrip()은 문자열 오른쪽에 위치한 공백을 제거한다.

>>> name = "Jean-luc Picard "
>>> name
'Jean-luc Picard '
>>> name.rstrip()
'Jean-luc Picard'

lstrip()

lstrip()은 문자열 왼쪽에 위치한 공백을 제거한다.

>>> name = " Jean-luc Picard"
>>> name
' Jean-luc Picard'
>>> name.lstrip()
'Jean-luc Picard'

strip()

strip()은 문자열 왼쪽과 오른쪽, 양쪽에 위치한 공백을 동시에 제거한다.

>>> name = " Jean-luc Picard "
>>> name
' Jean-luc Picard '
>>> name.strip()
'Jean-luc Picard'
rstrip(), lstrip(), 그리고 strip(), 이 세 메서드 중 어느 것도 문자열 중간에 위치한 공백은 제거하지 않는다.  'Jean-luc'과 'Picard' 사이의 공백이 위 세 코드에서 계속 남아있는 것 처럼 말이다.

문자열이 특정 문자로 시작 혹은 끝나는지 확인하기

파이썬에서는 startswith()endswith() 메서드를 사용해 주어진 문자열이 특정 문자로 시작하거나 끝나는지 확인해볼 수 있다.

startswith()

startswith() 메서드를 사용할 때는 대소문자를 구분한다는 점을 잊지 말아야한다.

>>> starship.startswith("En")
True

다음과 같이 대소문자를 구분하지 않으면 False를 반환한다.

>>> starship = "Enterprise"
>>> starship.startswith("en")
False

endswith()

endswith() 메서드도 마찬가지로 대소문자를 구분해야 한다.

>>> starship.endswith("rise")
True

>>> starship.endswith("risE")
False

문자열 메서드와 불변성

전에 다룬 것 같이, 문자열은 불변객체이다. 즉, 생성된 후에는 변경될 수 없다. upper()lower() 메서드 같이 대부분의 문자열 메서드는 문자열을 변경하지만, 실제로는 수정 후 원본 문자열의 복사본을 반환하는 것이다.

>>> name = "Picard"
>>> name.upper()
'PICARD'
>>> name
'Picard'

위에서 name.upper()를 호출해도 변수 name은 변하지 않았다. 새로운 결과값으로 변수를 바꿔주고 싶다면, 그 결과를 변수에 다시 할당해주어야 한다.

>>> name = "Picard"
>>> name = name.upper()
>>> name
'PICARD'

name.upper()로 반환된 새로운 문자열을 name에 재할당함으로써 기존의 문자열 "Picard"가 오버라이딩 되었다.


문자열과 숫자 다루기

눈으로 보기엔 숫자이지만 문자열 자료형 타입의 형태를 가진 숫자는 우리의 예상과는 전혀 다르게 작동한다.

>>> num = "2"
>>> num + num
'22'

>>> num = "12"
>>> num * 3
'121212'

더 나아가서 만약 * 연산자를 두 문자열 사이에 사용하면 어떻게 될까?

>>> "12" * "3"
Traceback (most recent call last):
	File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'str'

위와 같이 파이썬에서는 TypeError를 일으키며 숫자가 아닌 시퀀스로 곱해질 수 없다고 말해준다. 왼쪽이든 오른쪽이든 언제든 * 연산자가 문자열 안에 사용되면 파이썬에서는 다른 한 쪽에서도 정수를 예상한다.

시퀀스(sequence)요소를 인덱스로 접근할 수 있도록 지원하는 파이썬 객체이다. 문자열은 시퀀스들로 구성되어있다.

그럼 문자열과 덧셈은 어떻게 작동이 될까?

>>> "3" + 3
Traceback (most recent call last):
	File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

다시 한번 파이썬에서는 TypeError를 일으킨다. 왜냐하면 + 연산자도 양쪽이 같은 숫자 형태이기를 예상하기 때문이다.

문자열을 숫자로 변경하기

문자열 안에 숫자로 수행하고 싶다면, 제일 먼저 문자열 안의 숫자를 숫자 형태로 변경해주어야 한다. 파이썬에서는 이런 작업을 수행할 수 있는 int() 함수와 float() 함수가 존재한다.

int() 함수의 int는 정수를 뜻하며 객체를 정수로 전환한다. 반면, float() 함수는 부동 소수점을 뜻하고 객체를 소수점이 포함된 숫자로 전환한다. 다음 예제를 확인해보자.

>>> int("12")
12

>>> float("12")
12.0

float() 함수를 사용해서 숫자의 소수점이 추가된 점을 주목해보자. 부동 소수점 숫자는 항상 최소 한 자리 이상의 소수점을 가진다. 이런 이유로, 부동소수점 숫자 형태처럼 생긴 문자열은 정수로 변경할 수 없다. 왜냐하면, 소수점 이후로 모든 것을 잃기 때문이다.

>>> int("12.0")
Traceback (most recent call last):
	File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '12.0'

숫자를 문자열로 변경하기

문자를 숫자로 변경해준 것과 같이 파이썬에서 str() 함수를 사용하면 숫자를 문자열로 변경할 수 있다.

>>> num_pancakes = 10
>>> "I am going to eat " + str(num_pancakes) + " pancakes."
'I am going to eat 10 pancakes.'

변수 안에 들어있지 않은 숫자 리터럴과도 사용이 가능하다.

>>> "I am going to eat " + str(10) + " pancakes."
'I am going to eat 10 pancakes.'

더 나아가서 산술 표현도 str() 함수로 다룰 수 있다.

>>> total_pancakes = 10
>>> pancakes_eaten = 5
>>> "Only " + str(total_pancakes - pancakes_eaten) + " pancakes left."
'Only 5 pancakes left.'

Reference