[자료구조] 문자열 with Python

COCOBALL·2023년 5월 11일

알고리즘

목록 보기
25/37
post-thumbnail

문자열 생성

a = "string"
print(a)
# 문자열 생성은 큰 따옴표, 작은 따옴표 전부 가능

문자열 인덱싱과 슬라이싱

a = "string's test"
print(a[0])
print(a[-1])
print(a[6:])

문자열 이스케이프 코드(escape code)

이스케이프 코드(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'

문자열 메서드

문자열에는 문자열 데이터에 대해 다양한 연산을 수행하는 메서드가 있다.

  • strip(): 문자열 양쪽 공백을 지우는 함수
  • lstrip(): 문자열 왼쪽 공백을 지우는 함수
  • rstrip(): 문자열 오른쪽 공백을 지우는 함수

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'
>>>

Reference

https://wikidocs.net/84384

profile
Welcome! This is cocoball world!

0개의 댓글