[자료구조] 문자열 with Python

COCOBALL·2023년 5월 11일
0

알고리즘

목록 보기
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개의 댓글