본문 바로가기
AI 공부/파이썬

파이썬 (문자열)

by AI Sonny 2022. 7. 22.
728x90

문자열이란?

문자들이 열거 되어있는 것으로 파이썬은 문자 하나도 문자열로 취급한다.

  • 문자열은 Sequence 자료형이다.
  • 문자열은 수정불가능한 객체이다.
  • 컴퓨터는 문자도 숫자(이진수)로 변경해서 저장 또는 처리해야한다.
  • 이진수로 변경하려면 어떠한 규칙이 있어야하는데 그 표준규칙을 인코딩이라고 한다.
  • 사람이 이해할 수 있게 문자로 원복하는 것을 디코딩이라고 한다.
  • ASCII (영어 키보드에 할당되는 모든 키), EUC-KR, UTF-8(세계적인 표준) 등이 있다.

큰 따옴표, 작은 따옴표 그리고 무적의 Doc String

작은 따옴표 안에 큰 따옴표를 넣는 법과 큰 따옴표 안에 작은 따옴표를 넣는 법은 동일하다.

 

두 개가 서로 겹치지 않게 사용하면 된다.

 

예시는 다음과 같다.

 

text = "나는 말했다.'안녕하세요'라고..."	# 큰 따옴표 안에 작은 따옴표

text = '나는 말했다."안녕하세요"라고...'	# 작은 따옴표 안에 큰 따옴표

 

위와 같은 경우는 줄을 바꾸면 오류가 발생한다. 하지만 Doc String을 쓰면 줄을 바꿔도 상관이 없다.

 

Doc String은 따옴표 3개를 이어서 쓰면 되는 것으로 무조건 문자열을 적은대로 표현할 수 있다.

 

그래서 이것은 개발자들 간에 주석으로도 사용이 된다.

 

"""문자열"""
'''문자열'''

 

이 외에도 \을 쓰면 문장의 시작과 끝으로 인식하는 것이 아닌 특수문자로 인식하여 따옴표를 나타낼 수 있다.

 

그리고 \n을 적으면 다음 줄로 이동하는 것, \t를 쓰면 4칸띄어쓰기 되는 것이 있다.

 


문자열 연산

문자열도 연산이 가능하다.

 

간단한 예시로는 다음과 같다.

 

text1 = "Hello"
text2 = "World"
print(text1+text2) # 더하기 기호는 문자열과 문자열을 이어 붙인다.

=> HelloWorld

text1*10    # 곱하면 문자열을 반복한다.

=> 'HelloHelloHelloHelloHelloHelloHelloHelloHelloHello'

'H' in text1
'Hello' == text1

=> 둘 다 True가 나온다

 


문자열의 인덱싱 및 슬라이싱

이번 문제는 간단한 문제를 예시로 들고, 넘어가겠다.

 

- 슬라이싱과 더하기 연산자를 이용하여 다음과 같은 출력이 나오도록 하시오.
 ==> 01011112222

phone = "010-1111-2222"
phone[:3] + phone[4:8] + phone[9:]

=> '01011112222'

 


String Formatting이란?

문자열 내의 특정한 값을 변수로부터 동적으로 받아 포함시켜 문자열을 생성시키는 것이다.

 

다음과 같은 예를 들 수 있다.

 

text = f"제 이름은 {name}입니다. 나이는 {age}입니다."
print(text)

 

f를 앞에 붙이고, {변수명}을 넣고 싶은 자리에 넣는 구조이다.

 

다음과 같은 9단을 보면 이해하기 쉬워질 것이다.

 

- 다음과 같이 9단을 보기 좋게 출력해보시오.

9 X 1 = 9
9 X 2 = 18
9 X 3 = 27
9 X 4 = 36
9 X 5 = 45
9 X 6 = 54
9 X 7 = 63
9 X 8 = 72
9 X 9 = 81

-------------정답-------------
print(f"{num} X 1 = {num*1}")
print(f"{num} X 2 = {num*2}")
print(f"{num} X 3 = {num*3}")
print(f"{num} X 4 = {num*4}")
print(f"{num} X 5 = {num*5}")
print(f"{num} X 6 = {num*6}")
print(f"{num} X 7 = {num*7}")
print(f"{num} X 8 = {num*8}")
print(f"{num} X 9 = {num*9}")
------------------------------

 


문자열 메소드란?

파이썬에는 문자열을 다루기 위한 다양한 메소드가 있다.

 

대/소문자화 하기 (upper( ), lower( )), 문자열 치환하기 (replace( )), 문자열 분리하기 (split( ))등이 있다.

 

- 대 / 소문자화 하기 (upper( ), lower( ))

text = "Hello Python"
text.upper()    # 모든 문자를 대문자로 변경

=> 'HELLO PYTHON'

text = "Hello Python"	# 모든 문자를 소문자로 변경
text.lower()

=> 'hello python'

 

- 치환하기 (replace( ))

A라는 문자열을 B라는 문자열로 바꾸는 것이다.

 

text.replace("P","C")   # 첫번째 인자에 매칭되는 모든 문자열을 두번째 인자의 문자열로 변경한다.
                        # 문자열은 수정불가능한 객체이므로 변경이 안된다.

 

- 문자열 분리하기 (split( ))

특정 구분자를 이용해서 문자열을 분리하여 리스트로 반환하는 것

 

text = '#8시간#하루종일#파이썬#하고있음'
result = text.split("#")    # 기준값을 줄 경우 다음과 같이 비어있는 문자도 리스트에 포함된다.
result

=> ['', '8시간', '하루종일', '파이썬', '하고있음']

result[1:]  # 슬라이싱으로 비어있는 문자를 날린다.

=> ['8시간', '하루종일', '파이썬', '하고있음']

 

- 문자열의 좌/우 공백 제거 (strip( ))

text = "        오늘 하루 너무 행복하다.    \n\n\n\n\n"
print(text.strip())     # rstrip,lstrip 사용하여 좌,우만 공백제거 가능

=> 오늘 하루 너무 행복하다.

 

- 문자열 합치기 (join( ))

split의 반대 개념으로 특정 문자열을 기준으로 리스트에 들어있는 문자열들을 합쳐주는 역할

 

문제 list => ['오늘', '하루', '너무', '행복하다']

"#".join(result) # 인자값으로 리스트 같은 자료형을 넣어주면 된다.

=> '#오늘#하루#너무#행복하다'

 

- 특정 문자열로 시작하는지와 끝나는지에 대한 여부를 반환 (startswith( ), endswith( ))

text = "이제는 날이 점점 더워지는 것 같아요."
text.startswith("이제는")

=>True

str_list = ["오늘은 몇 일 입니까?", "파이썬 쉽다!", "내일 만나요...", "주말에 복습하실꺼죠?"]

print(str_list[0].endswith("?"))
print(str_list[1].endswith("?"))
print(str_list[2].endswith("?"))
print(str_list[3].endswith("?"))

=>True
  False
  False
  True

 

- 특정 문자를 세기 (count( ))

text = "이제는 날이 점점 더워지는 것 같아요."
text.count("이")

=> 2

 

- 문자열의 앞을 지정한 길이로 0으로 채우기 (zfill( ))

a = "1"             # 파일들을 담아두고, 정렬할 때 유용하게 쓰인다.
a.zfill(5)

=> '00001'

 

zfill( ) 메소드는 파일들을 정렬할 때 유용하게 쓰이는데 예시로는 다음과 같다.

 

img_files = ["img_10.jpg","img_1.jpg","img_3.jpg","img_8.jpg"]  # 정렬이 안됨!
sorted(img_files)

=> ['img_1.jpg', 'img_10.jpg', 'img_3.jpg', 'img_8.jpg']

--------------------------------------------------------------------------------------
img_file = "img_1.jpg"      # lst 기준으로 나눔
lst = img_file.split("_")
lst

=> ['img', '1.jpg']

--------------------------------------------------------------------------------------
lst[1] = lst[1].zfill(6)    # 10의 자리를 기준으로 정렬하기 위해 6을 넣음
lst[1]

=> '01.jpg'

--------------------------------------------------------------------------------------
"_".join(lst)               # 다시 "_"를 붙여줌!

=> 'img_01.jpg'

 

처음에 파일명을 정렬하면 정렬이 이상하게 된다.

 

왜냐하면 10과 3을 비교하면 앞의 자리만을 보고 비교하기 때문에 우리가 원하는 것처럼 정렬이 되지 않는다.

 

결국 정렬하기 위해선  파일명들에서 _(언더바)를 기준으로 나누어 주고,

 

두번째 배열에 있는 '1.jpg'를 '01.jpg'로 바꿔준다.

 

이 후 _(언더바)를 붙여서 다시 파일명을 정렬해주면 파일 정리가 끝나게 된다..!

 

728x90

댓글