본문 바로가기
국비 교육/파이썬

[파이썬] 문자열 다루기

by 육츠 2023. 11. 4.
Contents 접기

문자열

문자열은 immutable한 데이터이다.(객체값이 불변이다.)
' '," ",''' ''',""" """

mystr = "학교종이 땡땡땡"
print(mystr) # 학교종이 땡땡땡
print(mystr[0]) # 맨 앞 : 학
print(mystr[-1]) # 맨 마지막 : 땡

# mystr[1] = "원"  err # 문자열 값은 변경 불가능
# 여러 줄 출력

mystr = """동해물과 백두산이 마르고 닳도록
하느님이 보우하사 우리나라 만세
무궁화 삼천리 화려강산
대한사람 대한으로 길이 보전하세"""
print(mystr)

# 동해물과 백두산이 마르고 닳도록
# 하느님이 보우하사 우리나라 만세
# 무궁화 삼천리 화려강산
# 대한사람 대한으로 길이 보전하세

 

Escape Sequence

문자앞에 ' \ '를 붙여 언어에서 정의되어 있는 원래의 의미를 벗어나는 문자들을 말한다.

hello = 'I say "hello" to you'
print(hello) # I say "hello" to you

hello2 = "I say \"Hello\" to you"
print(hello2) # I say "Hello" to you

print("철수\t영희") # 철수	영희
print("철수\n영희") # 개행
# 철수
# 영희

 

문자열 추출(슬라이싱)

파이썬 문자열은 자바의 배열처럼 동작한다. (음수 가능)

- [:] : 처음부터 끝까지
- [start] : start 부터 offset 끝까지
- [:end] : 처음부터 end-1까지
- [start:end] : start 부터 end 까지
- [start:end:step] : step 만큼 문자를 건너 뛰면서 start부터 end-1까지 시퀀스 추출 

# 문자열 뒤집기
str = "hello" # olleh 로 출력
print(str[::-1]) # (start): (end): step = ::-1
# olleh


[문제] 파일 이름 슬라이싱

- 파일 이름 : 20231018-123920.jpg

[출력결과]
촬영날짜: 2023년 10월 18일
촬영시간: 12시 39분
확장자: jpg

fName = "20231018-123920.jpg"
print(f"촬영날짜: {fName[:4]} {fName[4:6]}월 {fName[6:8]}일")
print(f"촬영시간: {fName[9:11]}시 {fName[11:13]}분")
print(f"확장자: {fName[-3:]}")

 

문자열 관련 함수

 

예시 코드

s = '''생각이란 생각할수록 생각나므로
생각하지 말아야 할 생각은 생각하지 않으려고 하는 생각이
좋은 생각이라고 생각합니다.'''

print(s.count('생각'))  # 9
#  참조형 데이터 = 객체
# 객체변수.함수 (특정 객체가 가지고 있는 함수를 이용하는 방법)
# count = string 객체가 가지고 있는 count 함수

print(len(s)) # 내장함수 # 64

s = "Puthon programming"
print('a' in s) # True
print('b' in s) # False
# 데이터 안에 포함되어 있는가

s = "짜장 짬뽕 탕수육"
print(s.split()) # ['짜장', '짬뽕', '탕수육']
# 아무것도 해놓지 않으면 공백 기준 구분

s2= "서울->대전->대구->부산"
print(s2.split('->')) # ['서울', '대전', '대구', '부산']

city_list = ['서울', '대전', '대구', '부산']
city_string = ",".join(city_list)
print(city_string) # 서울,대전,대구,부산

s = "대한민국"
# 스트링도 하나의 리스트 이다
print('-'.join(s)) # 대-한-민-국

 

문자열 대입

%s %c %d %f %o %x %%
문자열 문자 1개 정수 부동소수 8진수 16진수 문자 %

 

포맷팅

문자열 내에 {} 괄호를 입력하고 format 함수의 인수로 삽입할 변수 또는 값을 입력하면 차례대로 인수 값이 전달된다.
{} 안에 0부터 시작하는 순서값을 지정할 수도 있다.

print("I eat %d apples"% 2)     # I eat 2 apples
print("I eat %s apples"% "two") # I eat two apples
print("I eat %d%%" % 95)        # I eat 95%

month = 8
day = 15
anni = "광복절"
print("%d월 %d일은 %s이다"%(month,day,anni)) # 8월 15일은 광복절이다

num = 4
day = "삼"
s = "나는 사과 {}개를 먹고 {} 일 동안 아팠다".format(num,day)
print(s)  # 나는 사과 4개를 먹고 삼 일 동안 아팠다

# 위치지정
num = 4
day = "삼"
s = "나는 사과 {1}개를 먹고 {0} 일 동안 아팠다".format(num,day)
print(s)

# 변수명 지정
s = "나는 사과 {num}개를 먹고 {day} 일 동안 아팠다".format(day = 7,num = 3)
print(s)

 

문자열 자리배치

% - 폭[.유효자리수] 서식
별도의 폭은 지정하지 않으면 변수의 자릿수만큼 차지하지만 폭을 지정하면 최소지정만큼 폭을 확보한다.

pie = 3.14159265
print("%10f" % pie)    #   3.141593
print("%10.8f" % pie)  # 3.14159265
print("%10.5f" % pie)  #    3.14159
print("%10.2f" % pie)  #       3.14

 

[문제] 주민등록번호 분석하기

임의의 주민등록번호를 입력받아 다음과 같이 성별을 추출하는 프로그램을 작성하시오
(입력) 881231-1234567 --> (출력) 88년생 남자

num = input("주민등록번호 : ") # input 은 문자열
year = num[:2]
gender = num[7]
s_gender= ''

if gender in['1','3']:
    s_gender = "남자"
elif gender in['2','4']:
    s_gender = "여자"
else:
    s_gender = "성별오류"

print("%s년생 %s"% (year,s_gender)) # 문자열 이니까 %s


[문제] 단어 수 세기

  • 문자열 내 전체 단어가 몇 개 인가?
  • 문자열 내 like 단어의 개수가 몇 개인가?
  • 문자열 내 가장 많이 나오는 단어는 무엇인가?
    1. 문자열 내에 줄바꿈 (\n) 문자를 공백 문자로 치환 replace(old string , new string)
    2. 문자열을 단어로 쪼갠다 split()
    3. 모든 단어를 소문자로 수정 변경 lower()
    4. 최빈 단어를 찾을때 사용하는 count() 함수는 split()을 통해 단어 단위로 분할된 리스트에 대해 사용한다
song = '''Hello, it's me
I was wondering if after all these years you'd like to meet
To go over everything
They say that time's supposed to heal ya
.... ''' # 노래 가사

song2 = song.replace('\n',' ')
# song = song.replace('\n',' ').lower() # 개행 띄어쓰기 변경 후 소문자 변경

song2_2 = song2.lower()
# print("like 단어의 개수:"song.count('like') )

song3 = song2_2.split()
# song3 = song2_2.split(' ') # 공백도 값이기 때문에 카운트가 됨 
# word_list = song.split()
# print("전체단어의 개수:",len(word_list))

like_c = song2_2.count('like')
song_l = len(song3)
# len 문자열의 길이값도 맞지만
# 집합형 데이터의 원소 개수를 세는데도 사용

max_w = " " # 가장 많이 나온 단어
max_c = 0 # 가장 많이 나온 단어의 횟수

for w in song3 :# word_list
    num = song3.count(w) # word_list.count(w) : 현재 단어 포함 횟수
    if num > max_c: 
        max_c = num
        max_w = w

print("가장 많이 나온 단어는 %s 이며 횟수는 %d이다"%(max_w, max_c))
print("like 횟수는 %d 이고 전체 단어의 수는 %d이다"%( like_c, song_l))

# 가장 많이 나온 단어는 to 이며 횟수는 14이다
# like 횟수는 1 이고 전체 단어의 수는 333이다

문제를 풀때 count 와 len의 역할, 그리고 replace를 잘 활용하여야 하여야 했다. 문제를 풀며 split()은 공백을 기준으로 구분한다. 공백 또한 글자로 인식 하기때문에 적절하게 잘 쓰여야 한다는 것을 알았다.

 

[문제] 영화예매 프로그램

10개 좌석만 있는 극장의 예매 프로그램 만들기
    (좌석 정보는 리스트로 선언)
    비어있는 좌석은 0으로 표기, 예매가 된 좌석은 1로 표기
    만약 예약되어있는 좌석을 예약하려 했을 때 적절한 오류 메세지를 출력하고
    해당좌석에 대해 다시 예약을 받는다

    [실행예시]
    좌석을 예약하시겠습니까?(예약: 1, 종료: 0 ) 1
    현재의 예약상태는 다음과 같습니다.
    ----------------------
    1 2 3 4 5 6 7 8 9 10
    ----------------------
    0 0 0 0 0 0 0 0 0 0

    몇 번째 좌석을 예약 하시겠습니까? 2
    예약 되었습니다.

    좌석을 예약하시겠습니까?(예약: 1, 종료: 0 ) 1
    현재의 예약상태는 다음과 같습니다.
    ----------------------
    1 2 3 4 5 6 7 8 9 10
    ----------------------
    0 1 0 0 0 0 0 0 0 0
    몇 번째 좌석을 예약 하시겠습니까? 2
    오류 메세지
플로우 차트
    > 1) 사용자로부터 입력을 받음 (예약:1, 종료:0)
    > 2-1) n = 1 ( 예매 동의 )
    > 2-2) n = 0 -> 프로그램 종료
    > 3) 좌석번호 입력
    > 4) 예매 좌석이 예매 가능한가 체크
    > 4-1) 불가능하면 다시 3) 으로
    > 5) 예매 완료
    > 6) 다시 반복 1)로

    - 반복 수행이다.
    - 반복문 안에 다른 반복문이 존재한다.
# 교수님 코드

seats =[0,0,0,0,0,0,0,0,0,0]
# 반복문 안에 들어가면 다시 0으로 초기화가 된다.
while True:
    isContinue = input("좌석을 예약하시겠습니까?(예약:1, 종료:0)")
    if isContinue == '0':
          print("예약 종료")
          break
    elif isContinue =='1':
        print("현재 예약 상태는 다음과 같습니다.")
        print("----------------------")
        print("1 2 3 4 5 6 7 8 9 10")
        print("----------------------")
        for s in seats:
            print("%d"%s,end=' ')
        print( ) # 한 줄 개행
        while True:
            seatNo = int(input("몇 번째 좌석을 예약 하시겠습니까?")) 
            # 리스트의 방 번호로 사용 -> 인티저로 변환
            if seats[seatNo-1] == 1:
                print("이미 예약된 좌석입니다. 다른 좌석을 선택하세요.")   
            else :
                seats[seatNo-1] = 1 # 예약 됨
                print('\n예약되었습니다.')
                break

> 좌석이 전부 찰 때까지 코드를 반복하기 위해 while 이라는 횟수를 측정하지 않는 반복문안에서 시작한다.
> 종료를 위해 0을 입력하면 break를 사용하여 반복문을 종료한다.
> while문을 중첩으로 사용하여 좌석의 예약을 받는다.
> 예약하고자 하는 seatsNo를 입력받고 리스트의 방 번호와 입력한 좌석번호는 같지 않으므로 1을 빼서 그 좌석이 예약이 가능한지 불가능한지를 비교하여 예약을 진행한다.
>> 해당 문제를 교수님이 내주실 때 나는 이 문제를 풀지 못 하였다. 풀지 못한 부분은 0 0 0 ... 의 좌석 상태를 0 1 0 0 .. 등 입력받은 좌석에 예약여부를 변경하는 방법을 해결하지 못 하였었다..