본문 바로가기

Engineering

파이썬 문자열 함수 훑어보기

요즘 문자열 처리를 자주 하게 되는데 기본적인 함수도 똑바로 알고있지 않은 것 같아서 파이썬에서 제공하는 문자열 함수를 훑어보고 이해도를 높이기로 했다. 참고한 문서는 다음과 같다.

 

Built-in Types

The following sections describe the standard types that are built into the interpreter. The principal built-in types are numerics, sequences, mappings, classes, instances and exceptions. Some colle...

docs.python.org

관련있다고 생각되는 함수들끼리 그룹화했고, 내 기준으로 중요한 순서대로 함수를 하나씩 소개하겠다.

문자열 검증 함수

주어진 문자열의 특성을 먼저 확인해야지 그 다음에 뭘 할 수가 있다고 생각되서 먼저 검증할 수 있는 함수들을 소개하겠다.

str.startswith, str.endswith

문자열이 특정 문자열로 시작하거나 끝나는 지 확인하는 함수이다. 워낙에 자주 사용하는 터라 첫 번째로 넣었다.

s = 'Winter is coming'
s.startswith('Win') # True
s.startswith('Sum') # False
s.endswith('ming') # True
s.endswith('mink') # False

str.isascii, str.isdecimal, str.isdigit, str.isnumeric, str.isalpha, str.isalnum, str.isspace

문자열이 특정 문자열 집합으로만 구성되어 있는지 확인해주는 함수이다. 아스키코드로만 구성되어 있는지, 숫자로만 구성되어 있는지, 알파벳으로만 구성되어 있는지, 알파벳+숫자로만 구성되어 있는지, 빈칸으로만 구성되어 있는지 알려준다. 한글에 관한게 없어서 아쉽다.

기타

정확히 무엇인지는 모르겠지만.. 식별자인지 확인해주는 함수인 str.isidentifier과 문자열을 출력할 수 있는지 확인해주는 함수인 str.isprintable이 제공된다.

문자열 검색 함수

문자열을 검증하는 것 외에도 문자열 내부의 문자열을 검색하고 어떤 부분문자열이 포함되어 있는지 포함되어 있다면 어느 위치에 있는 지 아는 것은 향후에 문자열을 처리할 때 많은 도움이 된다.

str.find, str.index, str.rfind, str.rindex

이 함수들은 문자열 내에서 특정 부분문자열이 있는지 찾고 있다면 그 부분문자열의 위치를 제공한다. 다만, find와 index의 차이점은 만약 부분문자열이 없을 경우에 find는 -1을 반환하고, index는 ValueError를 제공한다는 점이 다르다. 기본적으로 특정 부분문자열이 중복해서 발견되었을 경우, 가장 왼쪽에 있는 부분문자열의 위치를 알려주며 r이 붙은 함수를 사용할 경우, 가장 오른쪽에 있는 부분문자열의 위치를 알려준다.

str.count

문자열 내에 특정 부분문자열이 몇번 등장하는지 알려준다. 부분문자열이 등장할 때 겹쳐져서 등장할 수 있지만 이 함수는 겹쳐져있지 않은 경우만 세준다.

문자열 조작 함수

다음은 문자열을 조작해서 내게 필요한 방식에 맞게 변환하는 함수를 알아보자.

str.strip, str.lstrip, str.rstrip

이 함수들은 텍스트 데이터를 깨끗하게 만들 때 대표적으로 사용되는 함수이다. 주로 텍스트 데이터에는 빈칸이 앞뒤로 포함되어 있을 가능성이 있는데 이들을 없애줌으로써 데이터에서 무의미한 빈칸을 지우고 깨끗하게 해주는 역할을 한다.

str.split, str.rsplit, str.join, str.splitlines

주어진 문자열을 특정 문자열을 기반으로 나누거나 합치는 함수를 의미한다. 정확히 str.rsplit이 어떤 차이점이 있는진 잘 모르겠다. 이것도 여러 줄로 이루어진 문자열을 줄마다로 나누거나, 빈칸을 기반으로 나눠서 단어를 찾는다거나 하는 용도로 사용할 수 있다. 여러 줄로 이루어진 문자열을 줄마다 나누는 함수인 str.splitlines도 구현되어 있어서 이번에 처음 보긴 했는데 써도 되는 것 같다.

str.replace

문자열 내에 특정 문자열을 다른 문자열로 변경해주는 함수이다. 나름대로 유용하며, count라는 인자로 몇 번째까지 등장하는 문자열을 바꿀지 지정할 수 있다.

str.format, str.format_map

파이썬에서는 중괄호를 활용해 placeholder를 구성하고 나중에 그 placeholder에 값을 채워넣을 수 있다. 이때 값을 채워넣게 해주는 함수가 이 함수들이다. str.format_map은 딕셔너리로 구성해서 넘기는 것을 지원해주는 synthetic sugar이다.

기타

이번에 처음 본 함수들이고 사실 중요한 느낌이 안 들긴 하지만 아직 모르는게 아닐까 싶은 함수들을 한번 모아서 보기로 했다.

3개로 나누어주는 함수: str.partition, str.rpartition

문자열에서 주어진 문자열을 기준으로 오른쪽, 주어진 문자열, 왼쪽 이렇게 3개의 부분으로 나누어진 튜플을 반환하는 함수인 것 같다. r이 붙은 경우 주어진 문자열이 중복해서 나타날 경우 가장 오른쪽에 있는 문자열을 기준으로 쪼개준다. 만약 등장하지 않을 경우, str.partition는 튜플의 첫 번째 원소에 문자열이 몰려있고, str.rpartition의 경우 튜플의 마지막 원소에 문자열이 몰려있다.

Leading zero를 만들어주는 함수: str.zfill

특별히 사용할 일은 없을 것 같지만 (포맷팅을 이용한 다른 방법도 있어서) 앞에 0을 붙여주는 함수이다.

접미사나 접두사를 지워주는 함수: str.removeprefix, str.removesuffix

말 그대로 접미사나 접두사를 지워준다. python3.9부터 생겻다고 하니 아래 버전에서는 쓸 수 없음에 유의하면 될 것 같다.

파이썬 내장 번역 함수: str.maketrans, str.translate

내장된 번역 테이블을 이용해 번역할 때 사용되는 함수이다. 정확한 메커니즘은 모르겠으나 그리 어려워보이진 않고 필요할 때 배우면 될 것 같다. 이런 것이 있다는 것 정도만 확인해도 될 것 같다.

패딩을 만들어주는 함수: str.center, str.ljust, str.rjust

strip이 빈칸을 지워주는 역할을 했다면 이들은 반대로 빈칸을 만들어주는 역할을 한다. 어디다가 쓰는지 잘 모르겠지만.. 일단 있다..

탭을 빈칸으로 변환하는 함수: str.expandtabs

문자열 내의 탭을 빈칸 몇개로 바꿔주는 함수이다. 주로 vim 설정할 때, 파이썬의 인덴트 에러를 없애기 위해서 설정할 때 사용하는 키워드였는데 여기서 보니까 반가웠다.

인코딩 함수: str.encode

인코딩은 한글과 같은 아스키코드가 아닐 때 꽤나 중요하게 작용한다. 특정 텍스트가 utf8이 아닌 다른 인코딩되어 있으면 꽤나 골머리를 썩는다. 어쨋든 파이썬에서 문자열을 인코딩하려면 str.encode를 사용해서 인코딩할 수 있다. 주로 utf8로 인코딩하면 다 된다.

영어 대소문자 관련 함수

마지막으로, 영어 대소문자 관련 함수가 있다. 영어가 가장 많이 사용되는 언어라 그런지 이런 것도 내장되어 있었다.

str.islower, str.isupper, str.lower, str.upper, str.swapcase

문자열이 모두 소문자로 구성되어 있는지 대문자로 구성되어 있는지 확인하거나 모두 소문자로 바꾸거나 대문자로 바꿔주는 함수이다. 현재 소문자일 경우 대문자로, 대문자일 경우 소문자로 변경해주는 str.swapcase도 있다.

str.capitalize, str.istitle, str.title

문자열의 맨 앞 글자만 대문자로 바꾸고 나머지는 소문자로 바꿔주는 str.capitalize 함수와, 문자열의 각 단어마다 맨 앞글자를 대문자로 나머지는 소문자로 바꿔주는 str.title과 그런 형태인지 확인하는 str.istitle도 있다.

기타

정확히 뭔지 모르겠지만.. 라틴어 계열에서 발생하는 문제를 해결해주는 것 같은 str.casefold 함수도 있었다.

결론

파이썬에 내장된 문자열 함수들을 살펴보았다. 생각보다 다양한 함수가 있었지만 크게 쓸모있다고 느껴지진 않았다. 한번 더 복습하는 시간이 되었던 것 같다. 이외에도 string이라는 패키지에 더 많은 함수가 포함되어 있으니 살펴보면 좋을 것 같다.