Zeta Oph's Study

[Python 기초 문법] 문자열(String) 본문

프로그래밍/Python

[Python 기초 문법] 문자열(String)

Zeta Oph 2024. 3. 2. 22:07

학인시 3일 남았다... 이번에는 문자열(String) 관련해서 정리를 해보겠습니다.

 

* 먼저 알고 갈 것

문자열은 불변객체이다. 즉, 아래와 같이 사용하면 오류가 난다.

a = "asdf"
a[0] = b #error

문자열 포맷팅

문자열 중간에 변수의 값을 넣고 싶을 때 사용

v1 = 137
v2 = "qwer"
v3 = 2.718 

print("v1 is "+str(v1)+", v2 is "+str(v2)+", v3 is "+str(v3)) #1
print("v1 is %d, v2 is %s, v3 is %f"%(v1, v2, v3)) #2
print("v1 is {0}, v2 is {1}, v3 is {2}".format(v1, v2, v3)) #3
print(f"v1 is {v1}, v2 is {v2}, v3 is {v3}") #4
TERMINAL

v1 is 137, v2 is qwer, v3 is 2.718
v1 is 137, v2 is qwer, v3 is 2.718
v1 is 137, v2 is qwer, v3 is 2.718
v1 is 137, v2 is qwer, v3 is 2.718

 

위 3가지 방식은 모두 같은 결과를 출력한다.

#1 변수 값을 str()을 이용하여 string으로 바꾸는 방식

#2 %을 이용한 포맷팅 : 서식문자로 지정 후 순서대로 대입

#3 format 함수를 이용한 방법 : {0}, {1}, ...에 순서대로 대입

#4 f-string 문법 : 문자열 앞에 f 붙이고 변수 이름 바로 대입

변수를 대입하는 방법(% 포맷팅, format 함수)은 변수를 당연히 순서대로 대입해야 하고, 개수도 맞춰 주어야 한다.

 

서식 문자는 아래와 같다.

%d 정수 %c 문자(char)
%f 실수 %s 문자열(string)
%e 공학표기(e) %o 8진법 표기
%E 공학표기(E) %x 16진법 표기 (소문자)
%g 혼용표기(e) %X 16진법 표기 (대문자)
%G 혼용표기(E) %% 문자 %

 

공학표기 : 큰 숫자를 10의 거듭제곱을 이용하여 표기 ex) 123000 = 1.23 * 10^5

혼용표기 : 작은 숫자일때는 그냥 표기, 큰 숫자일때는 공학표기 사용 (e+06부터 공학표기)

 

%5d, %10s 와 같이 숫자를 써주면 5칸, 10칸을 차지한 채 출력된다. 변수 값의 길이가 숫자보다 크면 원래대로, 작으면 공백으로 칸을 채워서 출력된다. (%d, %s 이외의 것도 가능하다)

 양수이면 우측정렬, 음수이면 좌측정렬이다. 

 

실수의 경우에 %.3f 와 같이 표시하면 반올림을 통해 소수점 아래 3째자리까지만 출력된다.

칸을 차지하는 것과 같이 쓸 때는 %4.2f와 같이 써주면 된다.

 

a = 123.4567
print("a is %.2f wow"%a)
print("a is %10f wow"%a)
print("a is %10.2f wow"%a)
print("a is %-10.3f wow"%a)
TERMINAL

a is 123.46 wow
a is 123.456700 wow
a is     123.46 wow
a is 123.457    wow

 

실수의 칸 채우기는 기본적으로 소수점 아래에 0을 채워서 실행된다.

%4d는 공백을 이용하여 4칸 채우기이고, %04d는 0을 이용하여(숫자 앞에 0 붙이기) 4칸 채우기이다.


in 연산자

시퀀스 객체에 사용할 수 있는 연산자 -> 문자열 말고도 리스트, 튜플 등에 사용 가능

용법이 2가지가 있다.

a = "abcdefg"

#1
if "ab" in a:
    print("True")
else:
    print("False")

#2
for i in a:
    print(i, end=' ')
TERMINAL

True
a b c d e f g

 

#1은 in 연산자 앞의 것이 시퀀스에 포함되어있는지 확인하는 연산자 (if문과 함께 사용)

#2는 시퀀스에서 순서대로 하나씩 뽑아내어 앞의 변수에 전달하는 연산자 (for문과 함께 사용)

 

* 리스트/튜플 등은 원소를 대상으로, 문자열은 부분 문자열을 대상으로


문자열 멤버 함수

* 문자열 변수 이름이 a라고 생각하고 멤버 함수를 설명함. 

 

a.upper() : 알파벳을 모두 대문자로 - 결과값 문자열 반환

a.lower() : 알파벳을 모두 소문자로 - 결과값 문자열 반환

a.capitalize() : 문자열의 맨 첫글자만 대문자로 (맨 처음이 알파벳이 아닐 경우 변화 없음)  - 결과값 문자열 반환

a.title() : 알파벳 이외의 문자(숫자, 특수문자, 공백 등)으로 구분된 알파벳들 중 첫 글자만 대문자로 - 결과값 문자열 반환

 

a.isdigit() : 모두 숫자인지 확인 - boolean 반환

a.isalpha() : 모두 알파벳인지 확인 - boolean 반환

a.isupper() : 알파벳이 모두 대문자인지 확인 (특수문자, 공백, 숫자 등 섞여도 됨) - boolean 반환

a.islower() : 알파벳이 모두 소문자인지 확인 (특수문자, 공백, 숫자 등 섞여도 됨) - boolean 반환

 

a.startswith(prefix) : a가 문자열 prefix로 시작하는지 확인 - boolean 반환

a.endswith(suffix) : a가 문자열 suffix로 끝나는지 확인 - boolean 반환

 

a.find(str, start, end) : start와 end index 사이에서 str이 처음 나타나는 index를 반환함 - 결과값 int 반환 

인자가 하나만 전달될 경우 str로 취급

인자가 2개 전달될 경우 str와 start로 취급

start와 end의 기본값은 0, -1

 

a.replace(str1, str2, count) : a에서 str1을 모두 str2로 count 횟수만큼 바꿈 - 결과값 문자열 반환

기본값 count = -1 (무한)

 

a.strip(str) : 문자열 앞뒤로 str을 모두 지움 (여러개 있을 경우 다 지움) - 결과값 문자열 반환

a.lstrip(str) : 문자열 앞(left)의 str을 모두 지움 (여러개 있을 경우 다 지움) - 결과값 문자열 반환

a.rstrip(str) : 문자열 뒤(right)의 str을 모두 지움 (여러개 있을 경우 다 지움) - 결과값 문자열 반환

 

a.split(sep) : a에서 sep을 기준으로 나눔. 구분자 sep은 어디에도 포함되지 않음.- 결과값 리스트 반환

기본값 sep = ' ' (공백)

구분자 여러개 연속으로 있을 경우 ''이 리스트 원소로 포함되어 나뉘어짐

 

sep.join(a) : a의 사이사이에 sep을 끼워넣음 - 결과값 문자열 반환

a는 문자열 또는 리스트 (둘 다 반환값은 문자열)

a가 문자열일 경우 문자 하나하나 사이에 모두 구분자 sep 삽입

a가 리스트인 경우 원소 하나하나 사이에 모두 구분자 sep 삽입. 이때 모든 원소가 문자열이어야 함

 

ex)

a = "**1AB2AB3AB4AB5**"

b = a.lower()
c = b.title()
d = c.strip('*')
e = d.split('A')
f = '&'.join(e)
g = f.replace('b', 'c')

print(b)
print(c)
print(d)
print(e)
print(f)
print(g)
TERMINAL

**1ab2ab3ab4ab5**
**1Ab2Ab3Ab4Ab5**
1Ab2Ab3Ab4Ab5
['1', 'b2', 'b3', 'b4', 'b5']
1&b2&b3&b4&b5
1&c2&c3&c4&c5