Python

4. 문자열 다루기

구니리 2024. 10. 2. 19:38

1. 문자열 포맷팅


'''
문자열 포맷팅 - format() 함수 활용 
-'~{}  ~ {} '.format(변수1, 변수2 )
#1 예를 들면 print("나는 {}살입니다.".format(20)) 의미는 포맷 뒤에 있는 값을 중괄호에 집어넣음.
-'~{인덱스1}  ~ {인덱스2} ~'.format(변수1, 변수2 )
예를 들면 print("나는 {}색과 {}색을 좋아해요.".format("파란", "빨간"))
또는
예를 들면 print("나는 {0}색과 {1}색을 좋아해요.".format("파란", "빨간"))
이렇게 작성하면 0번에는 파란 1번에는 빨간이 들어가게 된다. 
응용하면
예를 들면 print("나는 {1}색과 {0}색을 좋아해요.".format("파란", "빨간"))
라고 입력하면 나는 빨간색과 파란색을 좋아해요. 와 같이 반대로 출력된다.5
-'~{변수1}  ~ {변수2} ~'.format(변수1=값1, 변수2=값2 )
-'~{변수1:서식자1} ~ {변수2:서식자2} ~'.format(변수1=값1, 변수2=값2)
서식자는 s, d, f, .소수점이하자릿수f

print("나는 {age}살이며, {color}색을 좋아해요.".format(age=20, color="빨간"))
즉 변수처럼 가져다 쓸 수 있다. 



'''
#2 
x, y = 10, 3
print( x , '+', y, '=', x+y) #10+3=13   
print('%d + %d = %d' %(x,y,x+y)) #10+3=13   ->%d 뒤에는 정수값만 입력한다.
print( x , '/', y, '=', x/y) #10 / 3 = 3.3333333333333335
print('%d / %d = %d' %(x,y,x/y)) #10 / 3 = 3 (정수로 출력)
print('%d / %d = %f' %(x,y,x/y)) #10 / 3 = 3.333333
print('%d / %d = %.2f' %(x,y,x/y)) #10 / 3 = 3.33
print('%d / %d = %10.2f' %(x,y,x/y)) #10 / 3 =       3.33 (전체 자리수가 10자리)
user = '홍줄리아'
print('성은 '+ user[0]+ ' 이름은 '+user[1:]+ ' 입니다.')
print (('성은 %s, 이름은 %s 입니다.' %(user[0],user[1:])))
%s 는 문자열 즉 string 값을 입력한다.    그런데 %s는 정수건 문자건 잘 출력할 수 있다.
%c 는 한 글자 입력 즉 character 이다.
if 두개 넣고 싶으면
print("나는 %s 색과 %s색을 좋아해요. " %("파란", "빨간")) 가능하다.




x,y = 10, 3
print( x, '+', y, '=', x+y) #10 + 3 = 13
print('{} + {} = {}'.format(x,y,x+y)) #10 + 3 = 13 #인덱스가 생략된 형태
print('{0} + {1} = {2}'.format(x,y,x+y)) #10 + 3 = 13
print('{1} + {0} = {2}'.format(x,y,x+y)) #3 + 10 = 13

# 변수와 초기값 지정 방식
x, y= 10,3
# z 는 위에서 정의한 변수를 참조
print('{x} + {y} = {z}'.format(x=2,y=3,z=x+y)) #2 + 3 = 13 

# 이미 정의된 변수를 초기값으로 재사용하는 방식
x, y= 2, 3
print( '{x}+{y}={z}'.format(x=x, y=y, z=x+y))

# 서식자 사용 테스트
pi = 3.14156748
print( ' pi 값은 {}'.format(pi)) #pi 값은 3.14156748
print( ' pi 값은 {0:.2f}'.format(pi)) #pi 값은 3.14
print( ' pi 값은 {:.2f}'.format(pi)) #pi 값은 3.14
print( '1:{num:.2f} ...2:{num:.4f}'.format(num=123.456789)) #1:123.46 ...2:123.4568

 
# 다른 방법
age=20
color = "빨간"
print(f"나는 {age}살이며, {color}색을 좋아해요.") 즉, 먼저 f쓰면 위에 있는 값을 갖다쓰게됨.



'''
패딩 옵션 : >, <, ^
'~ {변수1:서식자} ~ {변수2:서식자} ~'.format(변수1,변수2)
서식자로 >자릿수, <자릿수, ^자릿수
공백대신 대체문자 이용 => 대체문자>자릿수, 대체문자<자릿수, 대체문자^자릿수

'''

user_name = '홍길동'
print('****{}****'.format(user_name)) #****홍길동****
print('****{:>10}****'.format(user_name)) #****       홍길동****
print('****{:<10}****'.format(user_name)) #****홍길동       ****
print('****{:^10}****'.format(user_name)) #****   홍길동    ****
print('****{:.^10}****'.format(user_name)) #****...홍길동....****

2. 문자열 함수
'''
//문자열 함수
문자열변수.함수명(옵션) - upper(), spilit(), find(), index() ...
함수명(문자열변수, 옵션) - len(), str()
'연결문자' .join(문자열변수)

'''
# 여러행으로 구성된 샘플 문자열 변수 정의
sampleTxt = """Lorem Ipsum is simply dummy text of the printing and typesetting 
industry. 
Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, 
when an unknown printer took a galley of type and scrambled it to make a type 
specimen book. It has survived not only five centuries, 
but also the leap into electronic typesetting, remaining 
essentially unchanged. It was popularised in the 1960s with the release 
of Letraset sheets containing Lorem Ipsum passages, 
and more recently with desktop publishing software 
like Aldus PageMaker including versions of Lorem Ipsum.
 """
 
print(f'문자열 길이는? {len(sampleTxt)}') #문자열 길이는? 585
# 문자열변수.count(단어) : 단어가 문자열 변수안에 몇번있는지 빈도수 반환
print(sampleTxt.count('Lorem')) #4

# 문자열변수.find(단어) : 단어의 시작 위치 반환, 없다면 -1 
# 문자열변수.index(단어) : 단어의 시작 위치 반환, 없다면 에러발생
print(sampleTxt.find('is'), sampleTxt.index('is')) #12 12
print(sampleTxt[12:14])
print(sampleTxt.find('파이썬')) #-1
# print(sampleTxt.index('파이썬')) --> 에러발생

# 문자열변수.replace(단어1, 단어2) --> 단어1을 단어2로 교체

print(sampleTxt.replace('is','was')) #변경된걸 미리보여줌.
print(sampleTxt.count('is')) #3, 원본은 변하지 않는다.

#교체된 내용을 원본 변수에 반영
#sampleTxt 문자열 변수에서 'is'를 찾아서 'was'로 변경 후 덮어쓰기
sampleTxt=sampleTxt.replace('is','was') # 본문에 덮어쓰기됨.
print(sampleTxt.count('is')) #0


Quiz
퀴즈

(1절)

동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세

(후렴)

무궁화 삼천리 화려강산 대한사람 대한으로 길이 보전하세

(2절)

남산위에 저 소나무 철갑을 두른듯 바람서리 불변함은 우리기상 일세 (후렴)무궁화 삼천리 화려강산 대한사람 대한으로 길이보전하세

 

문제

  1. 애국가 1,2 절에서 무궁화는 몇 번 나올까? 예시) 무궁화는 애국가 1~2절에서 ?번 나옵니다
  2. 애국가 1,2 절에서 '소나무'의 위치 인덱스 값은? 예시) 애국가 1~2절에서 "소나무"의 인덱스 위치는 ?입니다
  3. 애국가 1,2 절에서 줄바꿈 없이 출력하여라.
  4. 애국가 1절에서 아래 문자열만 출력하여라(슬라이싱, find() 활용)
  5. 예시) 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세
  6. 애국가에서 일부 슬라이싱 한 후 아래와 같이 출력하여라 (join() 활용)
  7. 예시) 동=해=물=과= =백=두=산=이= =마=르=고=

내가 푼 풀이

print(f'무궁화는 애국가 1~1절에서 {sampleTxt.count('무궁화')}번 나옵니다.')
print(f'애국가 1~2절에서 "소나무"의 인덱스 위치는 {sampleTxt.find('소나무')} 입니다.')
R = sampleTxt.replace('\n','')
print(R)
print(sampleTxt.find('세'))
print(sampleTxt.find('동'))
K = sampleTxt[5:39]
T = K.replace('\n','')
print(T)
print(sampleTxt.find('고'))
S = sampleTxt[5:18]
print('='.join(S))

 

#강사님 풀이'
'''
1) 문자열 변수 저장
2) count(), 문자열 포맷 기능 이용해서 출력
'''

anthem = '''(1절)
동해물과 백두산이 마르고 닳도록
하느님이 보우하사 우리나라만세
(후렴) 무궁화 삼천리 화려강산 
대한사람 대한으로 길이 보전하세
(2절)
남산위에 저 소나무 철갑을 두른듯
바람서리 불변함은 우리기상 일세
(후렴)무궁화 삼천리 화려강산 대한사람 대한으로 길이보전하세
'''

#1번문제
print(anthem)
word_count = anthem.count('무궁화')
print(f'무궁화는 애국가 1~2절에서 {word_count}번 나옵니다.')
print(f'무궁화는 애국가 1~2절에서 {anthem.count("무궁화")}번 나옵니다.')

#2번문제 find(), index()
word_idx = anthem.find('소나무') #index() 찾고자 하는 단어가 없다면 에러 발생.
print(f'애국가 1~2절에서 "소나무"의 인덱스 위치는 {word_idx}입니다.')
print(f'애국가 1~2절에서 "소나무"의 인덱스 위치는 {anthem.index("소나무")}입니다.')

#3번문제
#anthem 안에 내포된 줄바꿈기호 '\n'이 있다. 세보고 싶으면 print(anthem.count('\n')) 결과 9번
print(anthem.replace('\n','')) #\n 을 공백으로 변경

#4번문제
'''
1) 문자열 변수 저장
2) 슬라이싱 범위 값 찾기 : find(), 시작인덱스, 마지막인덱스
3) 출력
'''
start_idx = anthem.find('동해물과')
end_idx = anthem.find('만세') + 3 #'세' 뒤에 공백 3개줌
print( anthem[start_idx:end_idx])
print(anthem[start_idx:end_idx].replace('\n',' '))

#5번문제
'''
1) 문자열 변수 저장
2) 슬라이싱 범위 값 찾기 : find(), 시작인덱스, 마지막인덱스
3) 구분문자.join(문자열변수), 출력
'''

start_idx = anthem.find('동해물과')
end_idx = anthem.find('마르고') + 3
print( '='.join(anthem[start_idx:end_idx]))
print( '='.join(anthem[start_idx:end_idx]).replace(' ','')) # 공백 없애기

 

'''
추가 Quiz

# 1. 연산자 문제

답 : 5

x = 4
y = 2
z = 3
print((x ** y) // z)

# 2. 문자열 포맷팅 문제 (f-string) :

name = "John"
age = 25
height = 175.5
print(f"Name: {name}, Age: {age}, Height: {height:.1f} cm")

# f" ~{변수1} ~ {변수2:전체자릿수.소숫점이하자릿수f} ~ {변수3:<패딩숫자값}}"

# f" ~{변수1:<패딩숫자값} ~ {변수2:<패딩숫자값} ~ {변수3:<패딩숫자값}}"

답 : Name: John, Age: 25, Height: 175.5cm

# 3. 문자열 포맷팅 문제 (format() 함수) Name : Bob Score : 95.67

name = "Bob"
score = 95.6789
print("Name: {}, Score: {:.2f}".format(name, score))

# "~{인덱스1}~{인덱스2}~".format(변수1, 변수2) # 인덱스는 생략 가능

# "~{변수1}~{변수2}~".format(변수1=값1, 변수2=값2) # 인덱스는 생략 가능

답 :  Name: Bob, Score: 95.67

# 4. 문자열 함수 문제

s = "hello world"
print(s.title())

#title() : 첫글자만 대문자로 바꿈

답: Hello World

# 5. 문자열 슬라이싱 문제

s = "Data Science"
print(s[::3])

답: Dacn

# 6. 문자열 슬라이싱 문제

s = "Machine Learning"
print(s[1:10:2])

# start~ end-1 의 인덱스에 해당하는 문자열 반환

답 : ahn e

# 7. 문자열 인덱싱 문제

s = "Artificial Intelligence"
print(s[-5])

답 : g

# 8. 문자열 인덱싱 문제

s = "Deep Learning"
print(s[-3:])

답 : ing

# 9. 문자열 함수 문제

s = "Artificial Intelligence"
print(s.count('i')) # 소문자 i 갯수

print(s.count('I')) # 대문자 I 갯수
print(s.count('i')+s.count('I)) # 대소문자 상관없이 i갯수
print(s.upper().count('I')) #대소문자 상관없이 i갯수 5개, 메소드 체이닝 검색
#대소문자 구별

답 : 4

# 10. 문자열 함수 문제

다음 코드의 결과는 무엇일까요?

답 : b
text = "   Hello, World!   "
result = text.strip()  # 좌우 여백 없앤다.
print(f"'{result}'")  # 안에 인용부호 확인. "                 " 안에 '     '  있음.
즉, 좌우 여백만 날리고 추출

a. 'Hello,World! '
b. 'Hello, World!'
c. '    Hello, World!'

'''