반응형

Python3 str(문자열)의 편리한 기능들

작성 계기

C/C++을 사용하던 시작부터 프로그래머들 사이에서 유행한 말이 있었는데, 그것은 문자열 처리를 잘하는 프로그래머는 웬만한 프로그램을 거의다 해결할 수 있다는 말이었다. (하지만 영상처리를 해보면 어떨까?) 역시 기본에서 다루는 내용보다는 필자가 실제 프로그램을 작성하면서 유용했던 기능들 중심으로 정리를 한다.

str 자료형에 대해

C++ STL에서는 string 이라는 표준 클래스가 존재한다. 마찬가지로 python에서는 str 이라는 자료구조가 있다. 문장을 구성할때 문자 여러개가 모여서 구성을 하는 것이다. C/C++ 시절에는 사실상 문자의 배열로 운영이 되었기 때문에 사실 다루기 상당히 까다롭다. 하지만 수십년간의 프로그래머들의 경험에 의해서 문자 하나보다는 문장단위로 다루는 일이 많은 것을 겪어왔다. 그래서, C#, javascript, python 도 대부분 string 혹은 str 형을 기본적으로 제공하고 있다.

기본적으로 list 자료형과 비슷하지만 다르다. 이는 문자열을 다룰 필요한 메서드와 list 같은 배열형 자료를 다룰때 필요한 메서드에서 차이가 있기 때문이다. 사실 str의 경우 대부분 언어들에서는 비슷하게 지원을 해서 꼭 Python 만의 특징이라고 보기는 어렵다.

python str 자료형의 특징

문자열 비교

C/C++을 주로 사용한 사람이라면은 == 연산을 문자열에 바로 사용을 하면 기겁을 하게 될 것이다. 하지만, Python의 str 자료형은 사용해도 큰 문제가 없다. 이 기능이 워낙 강력하다 보니 오히려 enum 이라는 자료형을 잘 사용하지 않게 된다. python3에서 enum 자료형이 등장하게 된것은 3.5 버전 부터이고, 사용방법도 enum 내장 모듈을 class로 상속해서 사용을 하여 enum을 만들어서 사용하는 것 보다 문자열을 사용하는 것이 나을 수 도 있다. 하지만 IDLE의 인텔리전트 기능을 사용하기 위해서라면 enum을 사용하는 것이 더 편리하고 안전할 것이다.

예시)

'hello' == 'hello'
# True
'hello' == 'world'
# False

split() 특정 문자로 나누기

사실 문자열에서 특정 문자나 기호를 기준으로 정보를 나누는 것은 문자열을 다룰때 많이 다루게 된다. 대부분 프로그램들이 최소한 데이터를 다룰때 DBMA를 사용하지 않는 경우 바로 직접 파일을 다루는데, 이 때에 각 운영체제에서 파일의 경로를 '' 이나 '/' 을 사용하기 때문이다. 물론 현재는 크로스 플랫폼 이슈로 인해서 대부분 언어들은 파일경로를 다루는 모듈이 있다(C++의 경우 C++17부터 있다).
특정 문자로 나누는 메서드는 split()메서드이며, 첫번째 인자로 받은 문자을 기준으로 리스트형에 나눈 문자열들을 담아서 반환을 한다. 두번째 인자로 숫자가 들어갈 경우 입력받은 숫자만큼 첫번째로 입력 받은 문자열로 리스트에 나누어서 담은뒤 반환을 한다. 이 메서드는 웬만한 문자열을 다루는 프로그래밍 언어들에서 공통적으로 거의 있다.

예시)

'c\python3\hello'.split('\\')
# ['c', 'python3', 'hello']
'c\python3\hello'.split('\\', 1)
# ['c', 'python3\hello']

strip() 문자열의 양쪽에 특정 문자 제거

약간의 규모가 있는 프로그램을 작성하다 보면 설정값을 파일에 저장을 하고 이를 읽어서 사용하는 경우가 있는데, 이 경우 이 설정값이 있는 파일을 프로그램을 통해서만 건들면 되는데, 간혹 프로젝트 사정상 사용자가 옵션 파일을 건들여야 하는 경우가 있다. 특히 공백을 기준으로 문자열을 나누다 보면은 앞쪽이나 뒷쪽에 공백문이 저장되어 있는 경우가 발생된다. 이 경우 split() 메서드를 바로 사용하게 되면, 공백수 만큼 리스트의 길이가 생성된 것을 볼 수 있다.

물론 이를 제거하는 알고리즘을 구현하면 되지만 이런 경우가 생각보다 많다 보니 Python 에서는 아예 이러한 메서드를 제공한다. 단순히 strip()를 호출하면 문자열의 양끝단의 공백문을 제거하고 인자를 넣을 경우 해당 인자가 양끝에 있는 경우를 제거한다.

예시)

' hello world   '.strip()
# 'hello world'
'c:\python\hello\\'.strip('\\')
# 'c:\\python\\hello'

join() 문자열이 모인 리스트를 한 문자열로 만들기

split()과 반대 개념의 메서드로 join()을 호출한 문자열을 인자로 받는 리스트의 문자열들의 사이 사이에 넣어서 하나의 문자열을 반환을 한다. 여기서 사용되는 리스트의 원소는 모두다 str 자료형이어야 하는 제약이 있다(만약 이를 무시하면 에러메시지를 발생하면 죽는 프로그램을 볼 수 있다).

필자의 경우 파일에서 ','로 구분하는 문자열을 만들어야 할 때 많이 사용하였었다. 프로그램에서는 리스트에 숫치값을 넣어서 사용하다가 저장할때는 숫자가 아닌 문자열로 변환해서 저장하는 경우에 유용했다.

예시)

a = ['1', '2', '3', '4', '5']
aStr = ', '.join(a)
# aStr = '1, 2, 3, 4, 5'

보너스: 숫자 있는 리스트를 문자열형 리스트로 바꾸기

어떤 수치 데이터를 문자열로 변환하는 작업은 단순 반복 작업이다. 다행히 python에서는 이러한 단순 반복 작업을 간단하게 코드로 작성할 수 있는 문법적 특성이 존재한다.

예시)

a = [1, 2, 3, 4, 5]
aStrList = [str(it) for it in a]
# aStrList = ['1', '2', '3', '4', '5']

이렇게 join 메서드를 조합하면 단 2줄로 수치가 들어 있는 리스트를 하나의 문자열로 변환하는 것이 가능해진다.

문자열의 곱연산

리스트와 같은 기능으로 문자열로 곱연산이 가능하다. 콘솔용 프로그램을 만들 경우 구분 선을 사용할때 쉽게 사용하기도 한다.

예시)

a = '-'*80
# a = '--------------------------------------------------------------------------------'

format() 문자열 포맷

C 언어를 먼저 배울경우 printf() 함수를 써본적이 있을 것이다. 여기서 f의 의미는 format 이라는 의미이다. 실제로 문자열을 다루다 보면은 포멧이 있는 문자열을 작성하는 경우가 많다. 따라서 python도 str 자료형 자체에 format() 메서드를 지원한다. 다만, 이 메서드는 생긴지 얼마 안되었기 때문에 오래전에 구매한 기본서라면 format() 대신 % 기호를 이용해서 같은 비슷한 기능 사용할 수 있다. 하지만 가독성등 여러 이유로 가능하면 format() 메서드를 사용하기를 권장한다.

필자의 경우 프로그램에서 로그를 따로 저장할 경우 저장할 문자열 생성시 사용하기에 용이 했었다.

예시)

talk1 = 'hello, {}!'.format('lemi')
# talk1 = 'hello, lemi!'

in 포함 문자열 여부

C#의 contain()과 같은 역할을 하는 메서드로 문법상 굉장히 직관적이다. 예시로 이해하는 것이 매우 직관적이다.

예시)

'h' in 'hello'
# True
' ' in 'hello'
# False

find() 문자열 찾기

다른 프로그래밍 언어들에게 공통적으로 있는 것으로 처음으로 같은 문자열이 있는 index를 number(int)형으로 반환을 한다. 만약 없을 경우 -1을 반환한다. 인자는 단일 문자 혹은 문자열 전부 사용할 수 있다. 이 메서드로 특정 문자열 포함 여부도 확인이 가능하기 때문에 in 문법을 모를 경우 사용하게 된다.

하지만, find()로 포함 여부를 할 경우 이 의도를 주석으로 기록해주어야 하지만, 앞의 in의 문법을 사용하면 굳이 주석 없이 코드만으로 의도를 파악할 수 있으므로 포함 여부만 확인 할경우 find()보다는 in을 사용하는 것이 더 좋다.

예시)

index = 'hello'.find('l')
# index = 2
index = 'hello'.find(' ')
# index = -1

upper(), lower() 대소문자 변환

호출한 문자열을 upper()의 경우 대문자로 lower()는 소문자로 전부 변환하여 반환한다. 많이 쓰이는 기능은 아니지만, 검색 기능을 구현할 경우 대소문자 구분을 안 할 경우 사용시 편리하다. 그중에서도 가능하면 lower()를 많이 사용하는 편이다.

예시)

lowStr = 'hello'
upStr = lowStr.upper()
# lowStr = 'hello'
# upStr = 'HELLO'

기타 문자열을 다루는 더 강력한 방법

문자열로 부터 특정한 패턴의 의미있는 자료를 얻기 위해서는 정규표현식을 사용하는 것이 가장 효과적이다. 다만, 정규식을 사용하기 전에 간단한 문자열을 전처리과정으로 정리할 경우에는 가능하면 문자열에서 제공하는 메서드를 활용하는 것이 좋다.

반응형

'Python > Python3' 카테고리의 다른 글

[Python3]삼항연산자(Ternary operators)  (0) 2019.04.30
[python3]타입검사(Type Check)  (0) 2019.04.23
[Python3]List의 편리한 기능들  (0) 2019.04.19
[python]CSV 데이터 포멧 입출력  (0) 2018.10.22
[python]기본 Shell 활용  (0) 2018.10.20

+ Recent posts