페이지

2018년 7월 1일 일요일

4. 기본 문자열 함수 이해하기

문자열은 컴퓨터와 인간의 세계를 잇는 상호 작용의 기본 단위다. 거의 모든 원천 데이터는 문자열 형태로 저장되어 있다. 여기서는 텍스트 문자열을 읽고 변형하는 방법을 배운다.
여기서 다루는 모든 함수는 내장된 str클래스의 멤버다.

대.소문자 변환(case conversion)함수는 원래 문자열 s의 복사본을 반환한다. lower()함수는 모든 문자를 소문자로 변환하고, upper() 함수는 모든 문자를 대분자로 변환한다. 그리고 capitalize() 함수는 첫 번째 문자를 대문자로 변환하고, 나머지 문자들은 소문자로 변환한다. 이 함수들은 아파벳이 아닌 문자는 무시한다. 대.소문자 변환 함수는 62쪽에서 다룰 정규화의 가장 중요한 요소다.

프레디케이트(predicate)함수는 해당 문자열 s가 특정 클래스에 속하는지에 따라 True나 False를 반환한다. islower()함수는 모든 알파벳 문자가 소문자인지 체크한다. isupper()함수는 모든 문자가 대문자인지 확인한다. isspace()함수는 모든 문자가 공백인지 체크한다. isdigit()함수는 모든 문자가 0에서 9 사이 숫자인지 확인한다. 그리고 isalpha() 함수는 모든 문자가 a~z, A~Z사이의 아파벳 문자인지 체크한다. 여러분도 이 함수들을 사용해 단어가 정확하지, 정수가 양수인지, 올바르게 뛰어쓰기를 했는지 등을 테스트할 수 있다.

외부 파일이나 데이터베이스, 웹에서 데이터를 가져왔다면 때때로 파이썬은 문자열 데이터를 문자열이 아닌 바이너리 배열로 표현한다. 이때 파이썬에서는 바이너리 배열 앞에 b를 붙여서 표기한다. 예를 들어 bin = b"Hello"는 바이너리 배열이고, s="Hello"는 문자열이다. 여기서 s[0]은 'H'이고 b[0]은 72인데 72문자 'H'에 해당하는 ASCII문자코드(CHARCODE)다. 디코딩(decoding)함수는 바이너리 배열을 문자열로 변환한다. bin.decode()는 바이너리 배열을 문자열로 변환하고, s.encode()는 문자열을 바이너리 배열로 변환한다. 많은 팡썬 함수는 문자열로 변환된 상태의 바이너리 데이터를 처리한다.

문자열 처리의 첫 번째 단계는 원치 않는 공백(새로운 줄과 탭을 포함한)을 제거하는 것이다. lstrip()(왼쪽 공백 제거)과 rstrip()(오른쪽 공백 제거), strip() 함수는 문자열의 모든 공백을 제거한다(문자 사이의 공백은 제거하지 않는다). 이렇게 공백을 제거하다 보면 아무것도 없는 빈 문자열이 될 수도 있다.!

"Hello, world! \t\t\n".strip()
>>>
'Hello, world!'

때때로 문자열은 공백, 클록이나 쉼표 등 구분자로 분리된 여러 개의 토큰으로 구성되어 있다. split(delim=" ") 함수는 delim을 구분자로 사용해 문자열 s를 부분 문자열의 리스트로 쪼갠다. 구분자를 지정하지 않았다면 파이썬이 공백을 사용해 문자열을 쪼개고, 연속해서 공백이 있으면 이를 하나의 공백으로 인식한다.

"Hello,  world!".split()  # Hello, 와 world!사이에 2개의 공백이 있다.
>>>
['Hello', 'world!']


"Hello,  world!". split(" ")  # Hello, 와 world! 사이에 2개의 공백이 있다.
>>>
['Hello', ' ', 'world!']

"www.networksciencelab.com".split(".")
>>>
['www', 'networksciencelab', 'com']

자매 함수인 join(ls)는 객체 문자열을 접착제로 사용해 문자열 리스트 ls를 하나의 문자열로 붙인다. join()함수를 사용하면 문자열 조각을 재조합할 수 있다.

", ".join(["alpha", "bravo", "charlie", "delta"])
>>>
'alpha, brawo, chalie, delta'

앞의 예제에서 join() 함수는 접착제 문자열 사이에만 넣고, 첫 번째 문자열 앞이나 마지막 문자열 뒤에는 넣지 않는 것을 볼 수 있다. 문자열을 자르고 다시 합치는 것은 구분자를 다른 문자열로 치환하는 것과 같다.

"-".join("1.617.305.1985".split("."))
>>>
'1-617-305-1985"

이따금 여러분은 이 두가지 함수를 같이 사용해서 필요 없는 공백을 문자열에서 제거하고 싶을 것이다. 정규 표현식에 기반한 치환을 사용하면 같은 결과를 얻을 수 있다.

"  ".join("This string\n\r has many\t\tspaces".split())
>>>
'This string has many spaces'

find(needle) 함수는 해당 문자열에서 부문 문자열 needle이 처음 등장하는 인덱스를 반환하며, 부분 문자열이 없ㅇ르 때는 -1을 반환한다. 이 함수는 대.소문자를 구분(case-sensitive)한다. 문자열에서 특히 관심 있는 부분을 찾는데 find()함수를 활용할 수 있다.

"www.networksciencelab.com".find(".com")
>>>
21

count(needle) 함수는 대상 문자열에서 부문 문자열 needle이 등장하는 횟수를 반환한다. 이 함수 역시 대.소문자를 구분한다.

"www.networksciencelab.com".count(".")
>>>
2

문자열은 데이터 처리 프로그램을 구성하는 요소이지만 유일한 구성 요소는 아니며, 가장 효율적인 요소라고도 할 수 없다. 여러분은 앞으로 리스트(list), 튜플(tuple), 셋(set), 딕셔너리(dictionary)를 사용해 문자열과 수치형 데이터를 묶고, 더 효율적인 방법으로 검색하고 정렬하게 될 것이다.



댓글 없음: