a = "string"
print(a)
# 문자열 생성은 큰 따옴표, 작은 따옴표 전부 가능
a = "string's test"
print(a[0])
print(a[-1])
print(a[6:])
이스케이프 코드(escape code)는 데어 문자나 키보드에서 타이핑하기 힘든 문자를 나타내는데 사용
'\n' 라인 피드 (Line feed)
'\r' 캐리지 리턴 (Carriage return)
'\t' 탭 (Tab)
'\'' 작은 따옴표 (Literal single quote)
'\"' 큰 따옴표 (Literal double quote)
'\\' 백슬래시 (Literal backslash)
문자열의 각 문자는 내부적으로 유니코드(Unicode) 코드 포인트(code-point)로 저장
다음과 같이 이스케이프 시퀀스(escape sequence)를 사용해 정확한 코드 포인트를 지정할 수 있다.
a = '\xf1' # a = 'ñ'
b = '\u2200' # b = '∀'
c = '\U0001D122' # 낮음음자리표
d = '\N{FOR ALL}' # d = '∀'
문자열 인덱싱(String Indexing)
문자열은 문자에 액세스함에 있어서 배열 (array)과 비슷하게 작동한다. 0부터 시작하는 정수 인덱스(index)를 사용한다. 음수 인덱스는 문자열의 끝에서부터 상대적인 위치를 가리킨다.
a = 'Hello world'
b = a[0] # 'H'
c = a[4] # 'o'
d = a[-1] # 'd' (문자열의 끝)
또한 콜론(:)으로 인덱스 범위를 지정함으로써 슬라이싱(부분 문자열을 선택) 할 수 있다.
d = a[:5] # 'Hello'
e = a[6:] # 'world'
f = a[3:8] # 'lo wo'
g = a[-5:] # 'world'
끝 인덱스에 있는 문자는 (인덱싱 결과에) 포함되지 않는다. 생략된 인덱스는 문자열의 시작 또는 끝으로 간주한다.
문자열 연산
이어붙이기(concatenation), 길이(length), 멤버십(membership), 복제(replication)
# 이어붙이기(+)
a = 'Hello' + 'World' # 'HelloWorld'
b = 'Say ' + a # 'Say HelloWorld'
# 길이(len)
s = 'Hello'
len(s) # 5
# 멤버십 테스트(`in`, `not in`)
t = 'e' in s # True
f = 'x' in s # False
g = 'hi' not in s # True
# 복제(s * n)
rep = s * 5 # 'HelloHelloHelloHelloHello'
문자열 메서드
문자열에는 문자열 데이터에 대해 다양한 연산을 수행하는 메서드가 있다.
ex) 맨 앞이나 맨 뒤의 화이트 스페이스 제거
s = ' Hello '
string_strip = s.strip()
ex) 대소문자 변환
s = 'Hello'
l = s.lower()
u = s.upper()
ex) 텍스트 교체
s = 'Hello world'
string_strip = s.replace('Hello', 'Hallo')
기타 문자열 메서드
문자열에는 텍스트 데이터를 테스트하고 조작하는 다양한 메서드가 있다.
s.endswith(suffix) # 문자열이 suffix로 끝나는지 확인
s.find(t) # s에서 t가 처음 나타나는 곳
s.index(t) # s에서 t가 처음 나타나는 곳
s.isalpha() # 문자가 영문자인지 여부
s.isdigit() # 문자가 숫자인지 여부
s.islower() # 문자가 소문자인지 여부
s.isupper() # 문자가 대문자인지 여부
s.join(slist) # s를 구분자(delimiter)로 삼아서 문자열의 리스트 붙이기(join)
s.lower() # 소문자로 변환
s.upper() # 대문자로 변환
s.capitalize() # 문자열 앞 문자만 대문자로 변환
s.replace(old, new) # 텍스트 교체
s.rfind(t) # 문자열의 끝에서부터 t를 검색
s.rindex(t) # 문자열의 끝에서부터 t를 검색
s.split([구분자]) # 문자열을 분할해서 부분 문자열의 리스트를 만듦
s.startswith(prefix) # 문자열이 prefix로 시작하는 확인
s.strip() # 앞, 뒤의 공백을 제거
문자열의 변경 가능성(Mutability)
문자열은 변경 불가능(immutable) → 읽기 전용 / 한 번 생성하면 값이 바뀌지 않음
>>> s = 'Hello World'
>>> s[1] = 'a'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>>
→ 문자열 데이터를 조작하는 모든 연산과 메서드는 항상 새로운 문자열을 생성한다.
문자열 변환
다른 타입의 값을 문자열로 변환하려면 str()을 사용한다. 그 결과로 print()문이 생성하는 것과 같은 텍스트가 반환된다.
>>> x = 42
>>> str(x)
'42'
>>>
바이트 열(Byte String)
8비트 바이트가 끈(string)처럼 이어진 것으로 일반적으로 저수준 입출력(I/O)에 사용되며, 다음과 같이 쓴다.
data = b'Hello World\r\n'
첫 번째 따옴표 바로 앞에 소문자 b를 붙이면, 텍스트 열(text string)이 아닌 바이트열로 지정된다.
일반적인 문자열 연산은 대부분 작동한다.
data = b'Hello World\r\n'
len(data) # 13
data[0:5] # b'Hello'
data.replace(b'Hello', b'Cruel') # b'Cruel World\r\n'
인덱싱은 좀 다르게 작동하는데, 바이트 값을 정수로 반환하기 때문이다.
data[0] # 72 ('H'의 ASCII 코드)
ext = data.decode('utf-8') # 바이트 열 -> 텍스트 열
data = text.encode('utf-8') # 텍스트 열 -> 바이트 열
'utf-8'
인자(argument)는 문자 인코딩을 지정한다.
'ascii'
와 'latin1'
도 일반적으로 사용하는 값이다.
원시 문자열(Raw String)
원시 문자열은 백슬래시를 해석하지 않는 문자열 리터럴이다. 소문자 “r”을 앞에 붙여 원시 문자열임을 나타낸다.
>>> rs = r'c:\newdata\test' # 원시(백슬래시를 해석하지 않음)
>>> rs
'c:\\newdata\\test'
문자열은 입력한 그대로의 리터럴 텍스트다. 백슬래시가 특별히 중요할 때 이것을 사용하면 편리하다.
f 문자열(f-string)
포맷팅된 표현식 대체가 있는 문자열이다.
name = 'IBM'
shares = 100
price = 91.1
a = f'{name:>10s} {shares:10d} {price:10.2f}'
>>> a
' IBM 100 91.10'
b = f'Cost = ${shares*price:0.2f}'
>>> b
'Cost = $9110.00'
>>>