파이썬은 문자열을 다루는 데 특화된 언어다. 간결하면서 사용성이 뛰어나서 크롤링을 공부하기에 좋다. 문자열을 만들고 잘라내고 값을 끼워 넣는 문법이 그 사용성의 대부분을 차지한다.
여러 줄 문자열
따옴표를 한 개씩만 넣고 다음 줄로 넘어가면 EOL while scanning string literal 오류가 난다. 그럴 때는 따옴표를 세 개씩 넣어주면 된다. 이스케이프 문자 \n을 넣어서 표현할 수도 있으나 따옴표를 연속으로 쓰는 편이 깔끔하다.
context = """여러 줄에 걸친
문자열은 따옴표 세 개로."""더하기와 곱하기
문자열은 더하거나 곱할 수 있다. 더하는 것은 말 그대로 더하는 것이지만, 곱하는 것은 문자열끼리 곱하는 것이 아니라 반복을 뜻한다. 구분선을 그릴 때 쓸모가 있다.
"Hello" + "World" # HelloWorld
"Hello" * 2 # HelloHello
"Hello" * "World" # TypeError
print("=" * 20)음수 인덱스와 슬라이싱
인덱스는 특정 데이터를 가리키는 번호인데, 파이썬에서는 음수가 뒤에서부터 센다. s[-1]이 마지막 글자라 길이를 구해서 빼지 않아도 된다.
| p | y | t | h | o | n |
|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 |
| -6 | -5 | -4 | -3 | -2 | -1 |
슬라이싱은 시작 인덱스부터 해당 인덱스 직전까지를 잘라낸다. 한쪽을 비우면 그쪽 끝까지 간다.
s = "python"
s[3:5] # ho
s[:6] # 문자열 시작부터
s[0:] # 지정 인덱스부터 끝까지
s[:] # 전체이 성질로 문자열을 나눈다.
today = "20220219Sunny"
year, day, weather = today[:4], today[4:8], today[8:]문자열 함수
문자열을 다루는 함수도 여럿이다. count()로 문자 개수를 세고, find()와 index()로 위치를 찾고, join()으로 사이에 문자열을 끼워 넣는다. upper()와 lower()가 대소문자를 바꾸고, strip()과 lstrip(), rstrip()이 공백을 제거하며, replace()가 문자열을 바꾸고 split()이 문자열을 나눈다. 길이를 구하는 len()은 메서드가 아니라 내장 함수다.
값을 끼우는 세 방법
문자열에 값을 끼우는 방법은 나온 순서대로 점점 짧아졌다.
% 포매팅
C의 printf를 물려받았다. 코드는 문자열 %s, 문자 하나 %c, 정수 %d, 부동소수 %f, 8진수 %o, 16진수 %x가 있고, % 문자 자체는 %%로 쓴다.
"I eat %d bananas." % 3
"I bought %d %s." % (5, "bananas") # 여러 개는 튜플로
"Error is %d%%." % 98 # %% 아니면 ValueError
"%10s" % "hi" # 10칸에서 우측 정렬
"%-10s" % "hi" # 10칸에서 좌측 정렬
"%0.4f" % 3.42134234 # 소숫점 네 자리format()
인덱스와 이름을 쓸 수 있다.
"I eat {0} bananas.".format(3)
"I bought {2} {1}. But, {0} {3} were rotten.".format(5, "bananas", 2, "bananas")
"I bought {number} {fruit}.".format(number=5, fruit="bananas")
"{0:<10}".format("hi") # 왼쪽 정렬
"{0:>10}".format("hi") # 오른쪽 정렬
"{0:^10}".format("hi") # 가운데 정렬
"{0:=^10}".format("hi") # ====hi====
"{0:0.4f}".format(3.141592)
"{{apple}}" # 중괄호 자체는 두 번공백 채우기 문법은 "{0: 공백내용 정렬방법 자릿수}" 순서다. % 포매팅에는 가운데 정렬과 채움 문자가 없다.
f-string
파이썬 3.6부터 쓸 수 있다. 변수를 그 자리에 직접 적는다.
name, age = "신재윤", 27
f'나의 이름은 {name}입니다. 나이는 {age}입니다.'
f'나이는 {age + 3}입니다.' # 식도 쓸 수 있다
f"나의 이름은 {d['name']}입니다." # 딕셔너리도
f'{"hi":^10}' # 정렬 문법은 format과 같다
f'{pi:0.4f}'정렬과 소숫점 문법을 format()에서 그대로 가져오고 값만 자리에 직접 적으니, 셋 중 가장 짧고 읽기 좋다.
바꿀 수 없는 문자열
문자열 자료형은 요솟값을 바꿀 수 없는 immutable한 자료형이다. 자바의 String과 같다. 바꾸려면 새로 만들어야 하고, 슬라이싱으로 앞뒤를 이어 붙이면 된다. 자바에서 `substring`으로 하던 것과 같은 방법이다.
s = "python"
s[1] = "i" # TypeError
s = s[:1] + "i" + s[2:] # pithon같은 이유로 함수를 사용한다 해도 문자열 자체의 내용이 바뀌지는 않는다. replace()로 문자열을 변경한다는 것은 출력하는 과정에서 치환해주는 개념이지 원본의 내용이 바뀌는 것이 아니다.
find와 index의 차이
find()와 index()는 둘 다 위치를 찾는데 없는 값을 만났을 때 갈린다. find()는 -1을 반환하고 index()는 ValueError를 낸다. 입력에 특정 글자가 있는지 조건문으로 확인하려는 자리에서 index()를 쓰면 없는 경우에 프로그램이 멈춘다.