문자열 다루기
문자열은 작은따옴표나 큰따옴표로 감싸서 만든다. 문자열은 인덱스를 갖고 있고 이를 통해 접근이 가능하다.
word = 'grail'
sent = 'a scratch'
print(word[0])
print()
print(sent[0])
인덱스 슬라이싱을 사용하면 여러 개의 문자를 한 번에 추출할 수 있다.
print(word[0:3])
음수를 적용하면 -1이 마지막 문자이다.
print(sent[0:-8])
왼쪽과 오른쪽 중 하나만 지정하게 되면 마지막 위치까지 모두 추출한다.
print(word[:3])
문자열 메서드
문자열에 대한 작업을 하는 메서드가 여러 개 있다. 모두 소문자로 변환하거나 대문자로 변환하는 등 자주 사용되는 메서드를 봐보자.
join 메서드
join 메서드는 문자열을 연결하여 새로운 문자열을 반환하는 메서드이다. join 메서드 앞에 문자를 지정하면 해당 문자를 단어 사이에 넣어 연결해 준다.
d1 = '40°'
m1 = "46'"
s1 = '52.837"'
u1 = 'N'
d2 = '73°'
m2 = "58'"
s2 = '26.302"'
u2 = 'W'
coords = ' '.join([d1, m1, s1, u1, d2, m2, s2, u2])
print(coords)
splitlines 메서드
splitlines 메서드는 여러 행을 가진 문자열을 분리한 다음 리스트로 반환한다.
multi_str = """Guard: What? Ridden on a horse?
King Arthur: Yes!
Guard: You're using coconuts!
King Arthur: What?
Guard: You've got ... coconut[s] and you're bangin' 'em together.
"""
print(multi_str)
multi_str_split = multi_str.splitlines()
print(multi_str_split)
replace 메서드
문자열을 치환하고 싶을 때 사용하는 메서드이다. 치환을 원하는 문자열을 첫 번째 인자에 변경할 문자열을 두 번째 인자에 전달하면 치환된다.
guard = multi_str.replace("Guard: ", "").splitlines()[::2]
print(guard)
"Guard: " 부분을 없애는 것과 같은 효과이다.
문자열 포매팅
문자열 포매팅은 문자열을 편리하게 출력할 수 있게 해주는 기능이다.
다음과 같이 단어를 삽입할 위치를 {}로 지정하고 format 메서드에 원하는 단어를 전달하면 {} 위치에 전달한 단어를 삽입해 출력해준다. 이때 {}를 플레이스 홀더라고 부른다.
var = 'flesh wound'
s = "It's just a {}!"
print(s.format(var))
플레이스 홀더는 여러번 사용해도 괜찮다. {} 안에 숫자를 넣어 적용하면 된다.
s = """Black Knight: 'Tis but a {0}.
King Arthur: A {0}? Your arm's off!
"""
print(s.format('scratch'))
플레스 홀더안에 변수를 지정해도 된다.
숫자 데이터 포매팅
숫자 데이터도 플레이스 홀더를 사용할 수 있다.
print('Some digits of pi: {}'.format(3.14159265359))
플레이스 홀더에 :,를 넣으면 쉼표를 넣어 숫자를 표현할 수 있다.
print("In 2005, Lu Chao of China recited {:,} digits of pi".format(67890))
플레이스 홀더안에 여러 가지를 넣어 포매팅을 할 수 있다.
.n을 넣으면 소수점 이하의 숫자를 n개까지 출력하는 것이고, %를 추가하면 백분율로 환산한다.
print("I remember {0:.4} or {0:.4%} of what Lu Chao recited".format(7/67890))
만약 5자리의 숫자로만 표현하고 싶다하면 모자란 수는 앞에 채워서 출력해야 한다.
다음은 0으로 채워 출력한다는 것이다.
print("My ID number is {0:05d}".format(42))
%연산자로도 포매팅할 수 있다.
s = 'I only know %d digits of pi' % 7
print(s)
print('Some digits of %(cont)s: %(value).2f' % {'cont': 'e', 'value': 2.718})
위와 같이 삽입할 값이 문자열이라면 값을 삽입할 위치에 %s라고 입력해야 한다. 그 사이에 소괄호를 사용하여 변수를 지정한다.
f-string 포매팅
파이썬 3.6 버전에서 새롭게 도입한 포매팅이다. 사용방법은 format 메서드와 동일하다. 하지만 문자열 앞에 f를 붙인다는 점만 다르다.
var = 'flesh wound'
s = f"It's just a {var}!"
print(s)
lat='40.7815°N'
lon='73.9733°W'
s = f'Hayden Planetarium Coordinates: {lat}, {lon}'
print(s)
정규식으로 문자열 처리
수만 개의 문자열 중에서 내가 원하는 패턴의 문자열만 추출하려면 어떻게 해야 할까?
예를 들어 I like apple, I like to make application이라는 문자열에서 app을 포함하는 문자열만 추출하려면 어떻게 해야 할까? find 메서드를 사용해도 되지만 정규식을 사용하면 더 편리하다.
정규식 표현 - 문법, 특수 문자
정규식 표현에 사용되는 문법과 특수문자는 다음과 같다.
import re
tele_num = '1234567890'
m = re.match(pattern='\d\d\d\d\d\d\d\d\d\d', string=tele_num)
print(type(m))
print(m)
print(bool(m))
if m:
print('match')
else:
print('no match')
Match 오브젝트에는 찾아낸 패턴의 정보를 확인하 수 있는 다양한 메서드가 있다.
start와 end 메서드는 첫 번째와 마지막 인덱스를 반환한다. span 메서드는 찾은 패턴의 첫번째와 마지막 인덱스를 한 번에 반환한다. group 메서드는 찾아낸 패턴을 반환한다.
print(m.start())
print(m.end())
print(m.span())
print(m.group())
그런데 전화번호를 입력하는 방법이 꼭 고정되어 있는 것은 아니다. 패턴을 찾지 못하면 Match 오브젝트가 아닌 None을 출력한다.
tele_num_spaces = '123 456 7890'
m = re.match(pattern='\d{10}', string=tele_num_spaces)
print(m)
p = '\d{3}\s?\d{3}\s?\d{4}'
m = re.match(pattern=p, string=tele_num_spaces)
print(m)
tele_num_space_paren_dash = '(123) 456-7890'
p = '\(?\d{3}\)?\s?\d{3}\s?-?\d{4}'
m = re.match(pattern=p, string=tele_num_space_paren_dash)
print(m)
cnty_tele_num_space_paren_dash = '+1 (123) 456-7890'
p = '\+?1\s?\(?\d{3}\)?\s?\d{3}\s?-?\d{4}'
m = re.match(pattern=p, string=cnty_tele_num_space_paren_dash)
print(m)
compile 메서드 사용하기
패턴을 반복해서 사용하려면 compile 메서드로 패턴을 컴파일한 다음 변수에 저장하여 사용할 수 있다.
p = re.compile('\d{10}')
s = '1234567890'
m = p.match(s)
print(m)