문자열의 순서를 이용하는 인덱싱과 슬라이싱을 살펴보고, 문자열이 불변 자료형이라는 점을 확인한다. 이어서 문자열 탐색과 변환에 자주 사용되는 메서드를 소개하고, 여러 메서드를 연속해서 적용하여 문자열을 원하는 형태로 가공하는 방법을 익힌다.
10.1문자열 인덱싱/슬라이싱¶
문자열은 문자와 기호들 사이의 순서가 절대적으로 중요하다. 문자열 왼편에 위치한 항목부터 차례대로 0, 1, 2, 3 등의 인덱스index를 부여받는다. 인덱스를 이용하여 문자열에 포함된 정보를 확인하고 추출한다.
10.1.1문자열 인덱싱¶
인덱스의 대표적인 활용법이 문자열 인덱싱indexing이다. 인덱싱은 인덱스를 이용하여 문자열의 항목을 확인한다. 설명을 위해 아래 문자열을 이용한다.
colors = 'red, blue, yellow'0 번 인덱스 값
colors[0]'r'3 번 인덱스 값
colors[3]','인덱스를 문자열 오른쪽에서부터 차례대로 -1, -2, -3 등 음수로 지정할 수도 있다.
오른쪽 끝에 위치한 문자
colors[-1]'w'오른쪽 끝에 두 번째 문자
colors[-2]'o'문자열의 길이에 따라 사용할 수 있는 인덱스의 구간이 정해진다.
colors 변수가 가리키는 문자열은 길이가 17이기에
0부터 16까지의 정수 또는 -1부터 -17까지의 정수만 인덱스로 사용할 수 있다.
len(colors)17-17보다 작거나 16보다 큰 경우 IndexError 오류가 발생한다.
colors[50]---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
Cell In[7], line 1
----> 1 colors[50]
IndexError: string index out of rangecolors[-20]---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
Cell In[8], line 1
----> 1 colors[-20]
IndexError: string index out of range10.1.2문자열 슬라이싱¶
인덱스의 특정 구간에 속하는 부분 문자열을 추출할 때 슬라이싱slicing을 사용한다. 슬라이싱은 다음과 같이 실행한다.
문자열[시작인덱스:끝인덱스:보폭]시작과 끝은 슬라이싱 구간의 시작과 끝 인덱스를 가리키며 보폭은 항목 선택 규칙을 지정한다.
시작인덱스 : 시작 인덱스부터 문자 확인
끝인덱스 : 끝 인덱스 이전까지의 문자 확인
보폭: 시작 인덱스부터 보폭의 크기로 이동하며 문자 추출. 보폭의 크기가 1이면 생략 가능.
colors에서 'red' 문자열를 추출하고 싶다면 다음과 같이 하면 된다.
이유는 r의 인덱스는 0이고, d의 인덱스는 2이기 때문이다.
colors = 'red, blue, yellow'
colors[0:3]'red'보폭을 1로 지정해도 동일한 결과를 얻는다.
colors[0:3:1]'red'colors에서 5번 인덱스의 문자인 b부터 끝까지 하나씩 건너 뛰면서 추출하려면 다음과 같이 한다.
colors[5:len(colors):2]'bu,ylo'양의 정수와 음의 정수를 섞어서 인덱스로 사용할 수 있다. -1은 오른쪽 끝의 문자를 가리키는 인덱스임에 주의한다.
colors[5:-1:2]'bu,ylo'슬라이싱 인덱스의 기본값
시작인덱스, 끝인덱스, 보폭 각각의 인자는 경우에 따라 생략될 수도 있다. 그럴 때는 다음과 같이 지정된 기본값이 적용된다.
시작인덱스의 기본값 :0끝인덱스의 기본값 : 문자열의 길이보폭의 기본값 :1
colors[0:3:1]
colors[:3:]'red'colors[5:len(colors):2]
colors[5::2]'bu,ylo'보폭을 생략할 때는 둘째 콜론(:)도 함께 생략할 수 있다.
colors[0:3]
colors[:3]'red'슬라이싱 인덱스의 범위
문자열의 인덱스 범위를 벗어나는 값으로 슬라이싱을 실행해도 오류가 발생하지 않는다. 대신 문자열의 좌우 끝까지만 슬라이싱이 적용된다.
colors[-30:100]'red, blue, yellow'colors[5:100:3]'beyl'역순 슬라이싱
슬라이싱은 기본적으로 작은 인덱스에서 큰 인덱스 방향으로 확인한다. 하지만 보폭을 음의 정수로 지정하면 역순으로 항목을 추출한다. 역순으로 슬라이싱을 지정하려면 시작인덱스가 끝인덱스보다 커야 한다.
colors[-2:-8:-3]'oe'보폭이 -1이고, 시작 인덱스와 끝 인덱스를 생략하면 문자열 전체를 역순으로 추출한다.
colors[::-1]'wolley ,eulb ,der'10.1.3불변 자료형: 문자열¶
문자열은 불변immutable 자료형이다.
즉, 한 번 생성된 문자열은 수정할 수 없다.
따라서 인덱싱 또는 슬라이싱을 사용하여 값의 일부를 변경하려 시도하면
수정을 허용하지 않는 자료형을 수정하려 시도한다는 의미에서 TypeError가 발생한다.
예를 들어 아래 코드는 “Michael Jackson” 문자열에 포함된 항목을 인덱싱으로 수정할 수 없음을 보여준다. 심지어 대문자 'J’를 동일한 문자로 교체하는 것도 허용되지 않는다.
name = "Michael Jackson"
name[8] = 'J'---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[20], line 2
1 name = "Michael Jackson"
----> 2 name[8] = 'J'
TypeError: 'str' object does not support item assignment기존 문자열 자체를 수정할 수 없기에 필요하면 문자열 연산, 인덱싱, 슬라이싱 등을 활용하여 새로운 문자열을 생성해야 한다. 이때 당연히 기존 문자열을 활용할 수 있다.
예를 들어 아래 코드는 기존 이름에 주니어 호칭을 추가한다.
name_Jr = name + " Jr."
name_Jr'Michael Jackson Jr.'반면에 아래 코드는 마이클 잭슨의 자녀 이름을 생성한다.
name_dauter = f'Paris {name[-7:]}'
name_dauter'Paris Jackson'10.1.4예제¶
예제 1
날짜와 시간이 하나의 문자열로 다음과 같이 주어졌다.
datetime = "2026-05-08 14:35"인덱싱과 슬라이싱을 이용하여 아래 문자열을 생성하라.
"2026년 05월 08일 14시 35분"답:
datetime[0:4], datetime[5:7]처럼 필요한 구간을 추출한 뒤 문자열 이어붙이기를 활용하면 된다.
datetime[0:4] + "년 " + datetime[5:7] + "월 " + datetime[8:10] + "일 " + datetime[11:13] + "시 " + datetime[14:16] + "분"'2026년 05월 08일 14시 35분'예제 2
두 개의 문자열이 다음과 같이 주어졌다.
string = "PythonForPythonForPythonForPythonForPython"
substring = "ForPythonFor"substring이 겹쳐지는 것도 허용하면서 사용된 횟수를 확인하면 3번이다.
이 사실을 확인하는 코드를 for 반복문을 이용하여 작성하라.
힌트: 문자열 슬라이싱 활용
답:
먼저 아래 두 변수를 선언한다.
count:substring문자열이 사용되는 횟수 카운팅pos:string문자열을 대상으로for반복문을 실행할 때 문자열의 인덱스 역할 수행
count = 0
pos = 0이제 char 변수가 string 문자열에 포함된 각각의 문자를 가리키는 변수로 활용한다.
또한 char 변수가 가리키는 문자가 있는 곳에서부터 substring 문자열의 길이만큼 슬라이싱을 적용한 결과가
substring과 일치하는지 여부에 따라 count 값을 1만큼 증가시킨다.
이때 pos가 char의 인덱스 역할을 수행하도록 하여 슬라이싱을 적용하기에
for 반복문이 한 번 실행될 때마다 1씩 증가시킨다.
count = 0 # 카운팅
pos = 0 # 인덱스 역할
for char in string:
sub = string[pos: pos+len(substring)] # 슬라이싱
if substring == sub: # 슬라이싱으로 확인된 문자열이 맞는 경우
count += 1
pos += 1
print("중첩되어 사용됫 횟수:", count, "회")중첩되어 사용됫 횟수: 3 회
10.1.5연습문제¶
문제 1
기러기, 토마토, 우영우, bob, level 등처럼 앞으로 읽어도, 뒤로 읽어도 동일한 문자열을 회문palindrome이라 부른다. 토마토가 회문임을 보이는 한 줄 코드를 작성하라.
힌트: 슬라이싱 활용
문제 2
문자열에서 가장 긴 회문 부분 문자열을 찾고자 한다.
(1) 다음 문자열에서 가장 긴 회문 부분 문자열을 찾아 출력하는 코드를 작성하라.
word = "abaxyzzyxf"부분 문자열은 문자열에서 연속된 일부 문자열을 의미한다.
예를 들어 "aba", "xyzzyx"는 모두 word의 부분 문자열이며, 둘 다 회문이다.
실행 결과는 다음과 같아야 한다.
xyzzyx힌트: 중첩 for 반복문을 이용하여 가능한 모든 부분 문자열을 슬라이싱으로 확인할 것.
(2) 주어진 문자열에서 가장 긴 회문 부분 문자열을 찾는 함수 finding_palindrome(word)를 정의하라.
힌트: 이전 코드 활용
10.2문자열 메서드¶
문자열 자료형과 연계해서만 사용하는 함수들이 있다.
이와같이 특정 자료형과 연계해서만 사용하는 함수들을 메서드method라 부른다.
메서드는 일반적인 함수와는 달리
특정 자료형의 값을 먼저 언급하고 바로 이어서 점(.)과 함께 실행한다.
문자열 자료형과 함게 사용되는 메서드가 매우 많다. 여기서는 가장 많이 사용되는 메서드를 기능별로 나누어 소개한다.
Table 1:문자열 주요 메서드
기능 | 메서드 | 설명 |
탐색 |
| 인자로 지정된 문자열이 사용된 빈도 반환 |
소문자/대문자 |
| 모든 영어 알파벳이 소문자인 문자열 반환 |
교체/삭제 |
| 부분 문자열이 교체된 문자열 반환 |
쪼개기/결합 |
| 부분 문자열들로 구성된 리스트 반환 |
10.2.1탐색 메서드¶
아래 문자열을 이용하여 먼저 탐색과 관련된 메서드의 기능을 살펴 본다.
words = " \tMy life is so so cool! \n"count() 메서드
인자로 지정된 문자열이 몇 번 등장하는지를 확인한다.
예를 들어 'so' 문자열은 words에 두 번 등장한다.
words.count('so')2반면에 'soo' 문자열은 words 문자열에 등장하지 않는다.
words.count('soo')0find() 메서드
지정된 문자열이 처음 시작하는 곳의 인덱스를 확인한다.
예를들어, 'cool' 문자열은 words 문자열의 19 번 인덱스부터 시작한다.
words.find('cool')19등장하지 않으면 -1을 반환한다.
예를 들어 'col' 문자열은 words 문자열에 등장하지 않는다.
words.find('col')-1index() 메서드
지정된 문자열이 처음 시작하는 곳의 인덱스를 확인한다.
'cool' 문자열은 words 문자열의 19 번 인덱스부터 시작한다.
words.index('cool')19등장하지 않으면 오류가 발생한다.
예를 들어 'col' 문자열은 words 문자열에 등장하지 않는다.
words.index('col')---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[33], line 1
----> 1 words.index('col')
ValueError: substring not foundstartswith() 메서드
지정된 문자열로 시작하는지 여부를 판정한다.
예를 들어 words 문자열은 ' \tMy' 문자열로 시작한다.
words.startswith(' \tMy')True반면에 'My' 문자열로 시작하진 않는다.
words.startswith('My')Falseendswith() 메서드
지정된 문자열로 끝나는지 여부를 판정한다.
예를 들어 words 문자열은 'cool!' 문자열로 끝나지 않는다.
words.endswith('cool!')False대신 'cool! \n' 문자열로 끝난다.
words.endswith('cool! \n')True10.2.2새로운 문자열 생성 메서드¶
지금부터 언급되는 메서드는 word 문자열 자체는 그대로 두고 새로운 문자열을 생성한다.
words = " \tMy life is \tso so cool! \n"lower() 메서드
모든 영어 알파벳을 소문자로 변경한 문자열을 반환한다.
예를 들어 아래 코드는 word 문자열에 포함된 모든 문자열을 소문자로 변경한 문자열을 생성한다.
words.lower()' \tmy life is \tso so cool! \n'upper() 메서드
모든 영어 알파벳을 대문자로 변경한 문자열을 반환한다.
예를 들어 아래 코드는 word 문자열에 포함된 모든 문자열을 대문자로 변경한 문자열을 생성한다.
words.upper()' \tMY LIFE IS \tSO SO COOL! \n'replace() 메서드
지정된 부분 문자열이 지정된 다른 문자열로 교체된 문자열을 반환한다.
예를 들어 아래 코드는 word 문자열에 포함된 so 문자열을 모두 that 으로 변경한 문자열을 생성한다.
words.replace('so', 'that')' \tMy life is \tthat that cool! \n'strip() 메서드
인자를 지정하지 않으면 문자열 양끝에 위치한 모든 화이트 스페이스(\t, \n 등)를 삭제한 문자열을 반환한다.
단, 양끝이 아닌 경우의 화이트 스페이스는 그대로 둔다.
words_stripped = words.strip()
words_stripped'My life is \tso so cool!'인자 문자열을 지정하면 인자에 포함된 모든 기호를 문자열 양끝에서 최대한 많이 삭제한 문자열을 반환한다.
아래 코드는 양끝에서 모든 화이트 스페이스 뿐만 아니라 느낌표 '!',
소문자 와이 'y', 대문자 엠 'M'을 최대한 많이 삭제한다.
이 경우에도 양끝이 아닌 경우에는 그대로 남는다.
words.strip(' \t\n!yM')'life is \tso so cool'split() 메서드
인자를 지정하지 않으면 화이트 스페이스 기준으로 쪼개진 문자열들로 구성된 리스트를 반환한다. 이 과정에서 쪼개진 문자열 양끝에 있는 화이트 스페이스는 모두 제거된다.
words.split()['My', 'life', 'is', 'so', 'so', 'cool!']문자열을 인자로 지정하면 해당 문자열을 기준으로 쪼개진 단어들의 리스트를 생성한다.
예를 들어 아래 문자열은 단어들 사이에 하이픈 "-"이 위치한다.
hyphen_words = 'My-life-is-so-so-cool!'위 문자열을 "-"을 기준으로 쪼개면 다음과 같다.
hyphen_words.split("-")['My', 'life', 'is', 'so', 'so', 'cool!']join() 메서드
여러 개의 문자열을 결합한다.
join() 메서드를 호출하는 문자열은 지정된 항목들을 이어붙이는 연결고리 역할을 수행한다.
예를 들어 아래 코드는 hello 문자열에 포함된 모든 문자열들 사이에 별표 기호를 추가하여 새로운 문자열을 생성한다.
'*'.join('hello')'h*e*l*l*o'문자열로 구성된 리스트가 인자로 사용되면 항목으로 포함된 모든 문자열을 결합한다. 예를 들어 아래 코드는 하이픈을 공백으로 대체하여 하나의 문자열을 생성한다.
먼저 대체하고자 하는 하이픈을 기준으로 쪼갠다.
words_splitted = hyphen_words.split("-")
words_splitted['My', 'life', 'is', 'so', 'so', 'cool!']쪼개진 문자열을 공백을 연결고리로 활용하여 연결하여 새로운 문자열을 생성한다.
' '.join(words_splitted)'My life is so so cool!'10.2.3예제¶
예제 1
문자열의 islower() 메서드는 지정된 문자열에 대문자 알파벳이 없는지 여부를 판단한다.
즉, 소문자와 기타 기호만 포함할 때 True를 반환한다.
'abc'.islower()True'Abc'.islower()False'abc !'.islower()Trueisupper() 메서드는 반대로 판단한다. 즉, 소문자 알파벳이 없는지 여부를 판단한다.
'aBC'.isupper()False'ABC'.isupper()True'ABC !'.isupper()True다음 세 개의 함수는 입력된 문자열이 소문자를 하나라도 포함하고 있는지 여부를 조사하도록 구현되었지만 하나만 제대로 작동한다. 어느 함수가 제대로 작동하는지 확인한 다음 그 이유를 설명하라. 또한 다른 두 함수가 적절하게 구현되지 않은 이유를 설명하라.
def any_lowercase1(text):
for c in text:
if c.islower():
return True
else:
return False
def any_lowercase2(text):
for c in text:
if 'c'.islower():
return 'True'
else:
return 'False'
def any_lowercase3(text):
for c in text:
if c.islower():
return True
return False답:
아래 문자열에 대해 세 개의 함수를 테스트한다.
word1 = "ABcDE"
word2 = "ABCDE"any_lowercase1() 함수
def any_lowercase1(text):
for c in text:
if c.islower():
return True
else:
return False인자로 입력되는 문자열의 첫 문자가 소문자의 대소문자 여부를 확인하고 바로 반환값을 지정한다.
함수는 반환값이 지정되면 바로 실행을 종료하기에 결국 첫 문자만 확인하고 종료한다.
따라서 word1 변수가 가리키는 문자열에 소문자 'c'가 포함되어 있지만 첫 문자가 대문자이기에 False를 반환한다.
any_lowercase1(word1)Falseany_lowercase1(word2)Falseany_lowercase2() 함수
def any_lowercase2(text):
for c in text:
if 'c'.islower():
return 'True'
else:
return 'False'for 반복문의 본문이 함수의 인자를 전혀 활용하지 않는다.
이유는 if 'c'.islower() 에서 사용된 'c'는
for c in text의 c와 아무 상관이 없는 영어 알파벳 c 하나로
구성된 문자열이기 때문이다.
또한 'c'가 소문자이기에 결과는 항상 문자열 'True'로
심지어 부울값 True와 아무 상관이 없다.
any_lowercase2(word1)'True'any_lowercase2(word2)'True'any_lowercase3() 함수
def any_lowercase3(text):
for c in text:
if c.islower():
return True
return Falsefor c in text 반복문에서 c가 소문자를 가리키는 순간 True를 반환하며 종료한다.
그런데 소문자가 하나도 없으면 for 반복문이 끝까지 실행되고 결국 False를 반환한다.
any_lowercase3(word1)Trueany_lowercase3(word2)False결국 any_lowercase3() 만 소문자 포함여부를 제대로 결정한다.
예제 2
아래 current_time 변수는 시각을 서양식으로 표현된 문자열을 가리킨다.
current_time = 'Fri Mar 21, 2025'current_time 변수가 가리키는 문자열을 한국식, 즉 다음과 같이 출력하는 코드를 작성한다.
날짜: 2025년 3월 21일 금요일단, 아래 코드에서 선언된 세 개의 변수와 split() 메서드, f-문자열을 반드시 활용한다.
weekdays_en = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
weekdays_kr = ['일', '월', '화', '수', '목', '금', '토']
months_en = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']답:
먼저 문자열을 쪼개 각각의 정보를 얻는다.
ctime_split = current_time.split()
ctime_split['Fri', 'Mar', '21,', '2025']그런 다음 리스트 인덱싱을 이용하여 한국식으로 출력해본다.
weekday = ctime_split[0]
month = ctime_split[1]
day = ctime_split[2]
year = ctime_split[-1]
print(f"날짜: {year}년 {month}월 {day}일 {weekday}")날짜: 2025년 Mar월 21,일 Fri
실행 결과에 두 가지 문제가 있다.
날짜에 쉼표가 포함됨.
영어 표현이 그대로 사용됨.
먼저 날짜에 포함된 쉼표를 삭제하자.
day = day.strip(',')
day'21'좀 더 좋아졌다.
print(f"{year}년 {month}월 {day}일 {weekday}")2025년 Mar월 21일 Fri
이제 요일은 한글로, 월은 숫자로 변환한다.
weekday_index = weekdays_en.index(weekday)
weekday_kr = weekdays_kr[weekday_index]
weekday_kr'금'영어식 월 표현을 숫자로 변환하는 것은 보다 간단하다.
month_kr = months_en.index(month) + 1
month_kr3위 내용을 이용하여 원하는 결과를 출력할 수 있다.
weekday_index = weekdays_en.index(weekday)
weekday_kr = weekdays_kr[weekday_index]
month_kr = months_en.index(month) + 1
print(f"날짜: {year}년 {month_kr}월 {day}일 {weekday_kr}요일")날짜: 2025년 3월 21일 금요일
예제 3
다음 word에 할당된 문자열은 그 자체로는 회문이 아니다.
word = "여보게 저기 저게 보여"하지만 공백은 무시할 경우 회문이 된다.
word 문자열에서 공백을 모두 제거하면 회문이 됨을 보이는 코드를 작성하라.
힌트: 문자열 역순 슬라이싱
답:
먼저 공백을 없애기 위해 split() 메서드와 join() 메서드를 활용한다.
word_list = word.split()
word_list['여보게', '저기', '저게', '보여']word_wo_space = ''.join(word_list)
word_wo_space'여보게저기저게보여'회문 여부는 문자열을 바로 읽었을 때와 역순으로 읽었을 때 결과가 동일한지 여부로 판단된다.
word_wo_space == word_wo_space[::-1]True예제 4
문자열의 find() 메서드가 작동하는 방식을 이해하기 위한 예제다.
먼저 두 개의 문자열을 지정한다.
word1 = 'chukachuka'
word2 = 'uka'word2 변수가 가리키는 문자열이 word1 문자열에 처음 사용되기 시작하는 곳의 인덱스를
찾는 코드를 작성하라.
힌트: for 반복문, 문자열 슬라이싱, break 명령문 활용
답:
break 명령문을 활용하면 보다 간단하게 코드를 구현할 수 있다.
location = -1
pos = 0
for char in word1:
if word2 == word1[pos:pos+len(word2)]:
location = pos
break
pos += 1
print(word2, "가 시작되는 인덱스:", location)uka 가 시작되는 인덱스: 2
10.2.4연습문제¶
문제 1
변수와 함수의 이름을 지정할 때 낙타camel 표기법 또는 팟홀pothole 표기법을 사용한다.
낙타 표기법: 소문자로 시작하고, 이어지는 단어의 시작은 대문자로 작성하는 표기법.
팟홀 표기법: 모두 소문자를 사용하고, 단어 사이에 밑줄기호(
_)를 사용하는 표기법.
활용 예제는 다음과 같다.
낙타 표기법 예제:
userName,printMessage,countA등.팟홀 표기법 예제:
user_name,print_message,count_a등.
낙타 표기법으로 작성된 변수를 팟홀 표기법으로 변환하는 함수 camel_to_snake(name) 함수를 정의한 다음에 아래 변수를 변환하라.
CamelCase힌트: for 반복문과 isupper(), lower() 메서드 활용
문제 2
아래 message 문자열을 이용하여 단어 "you"가 몇 번 사용되었는지 확인하는 코드를 작성하라.
단, 대소문자는 구분하지 않는다.
힌트: count() 메서드 활용
message = "You're here because you believe you can do it. You're ready."문제 3
문자열 find() 메서드에 대응하는 find() 함수를 직접 정의하고자 한다.
(1) find(word1, word2) 함수는 두 개의 매개변수를 사용하며 각 매개변수의 기능은 다음과 같아야 한다.
매개변수: 두 개의 문자열을 인자로 받는
word1과word2두 개 사용word1이word2를 부분 문자열로 포함할 경우 부분 문자열이 시작하는 인덱스 반환. 포함하지 않을 경우 -1을 반환.
단, 문자열 인덱싱, 슬라이싱만 사용하고 다른 문자열 메서드는 전혀 사용하지 않아야 한다.
(2) 이번에는 find(word1, word2, position=0) 함수가 세 개의 매개변수를 사용하며 각 매개변수의 기능은 다음과 같도록 정의하라.
매개 변수: 두 개의 문자열을 인자로 받는
word1과word2두 개와 키워드 인자를 받는position.word1이word2를 부분 문자열로 포함할 경우 부분 문자열이 시작하는 인덱스 반환. 포함하지 않을 경우 -1을 반환.position매개변수: 탐색을 시작하는 인덱스 지정. 기본 키워드 인자로 0 사용.
단, 문자열 인덱싱, 슬라이싱만 사용하고 다른 문자열 메서드는 전혀 사용하지 않아야 한다.
힌트: range() 함수를 활용한 탐색 구간 지정
10.3메서드 연속 적용¶
lower(), replace() 함수에 의해 반환된 값이 문자열이기에 곧바로 다른 메서드를 연속해서 적용할 수 있다.
예를 들어, 아래 코드는 문자열 양끝의 화이트 스페이스를 무시하면 문자열이 'My'로 시작함을 확인해준다.
words.strip().startswith('My')True아래 코드는 앞서 하이픈 기호를 제거한 문자열을 생성하는 코드를 다음과 같이 한 줄 코드로 작성한다.
' '.join(hyphen_words.split("-"))'My life is so so cool!'반면에 아래 코드는 대문자를 모두 소문자로 변경된, 그리고 하이픈이 삭제된 문자열을 생성한다.
' '.join(hyphen_words.lower().split("-"))'my life is so so cool!'10.3.1예제¶
예제 1
문자열 'a:b:c:d' 을 이용하여 문자열 'a#b#c#d"을 생성하는 한 줄 코드를 작성하라.
abcd_colons = 'a:b:c:d'힌트: split()와 join() 메서드 활용
답:
'#'.join(abcd_colons.split(':'))'a#b#c#d'예제 2
아래와 같이 선언된 lyrics변수가 있다.
lyrics = "\t When you're smiling, the whole world smiles with you.\n\t "(1) lyrics가 가리키는 문자열이 대문자 W로 시작하는지 여부를 판단하는 한 줄 코드를 작성하라.
단, 화이트 스페이스는 무시한다.
답:
문자열 양 끝의 화이트스페이스를 제거한 다음에 바로 startswith() 메서드를 적용한다.
lyrics.strip().startswith('W')True(2) 위 문자열이 you.로 끝나는지 여부를 판단하는 한 줄 코드를 작성하라.
단, 화이트 스페이스는 무시한다.
답:
문자열 양 끝의 화이트스페이스를 제거한 다음에 바로 endswith() 메서드를 적용한다.
lyrics.strip().endswith('you.')True(3) 문자열 양 끝에 있는 화이트 스페이스를 모두 삭제하고, 모든 문자는 소문자로 변환된 문자열을 생성하는
한 줄 코드를 작성하라.
또한 "you're" 대신에 "you are" 가 사용되도록 해야 한다.
답:
문자열의 양 끝에 있는 공백, 줄바꿈, 탭 등의 화이트 스페이스는 strip() 메서드로 제거한다.
lyrics.strip()"When you're smiling, the whole world smiles with you."strip() 메서드의 반환값 또한 문자열이기에 바로 lower() 메서드를
적용하면 모든 철자가 소문자로 변환된 문자열이 생성된다.
lyrics.strip().lower()"when you're smiling, the whole world smiles with you."lower() 메서드 또한 문자열을 반환하기에 곧바로 replace() 메서드를 적용할 수 있다.
lyrics.strip().lower().replace("you're", "you are")'when you are smiling, the whole world smiles with you.'10.3.2연습문제¶
문제 1
아래 팟홀 표기법을 사용하는 문자열을 낙타 표기법으로 변환하는 한 줄 코드를 작성하라.
counting = 'one_Two_Three'힌트: split()와 join() 메서드 활용
문제 2
fruits 변수가 아래와 같이 과일 이름으로 구성된 문자열을 가리킨다.
fruits = "banana apple orange pineapple mango strawberry cherry"fruits 변수를 이용하여 아래 문자열을 생성하는 한 줄 코드를 작성하라.
Banana, Apple, Orange, Pineapple, Mango, Strawberry, Cherry힌트: 문자열 split(), title(), join() 메서드 활용
문제 3
아래 문자열은 상품 이름을 하이픈(-)으로 연결하고, 양 끝에 불필요한 공백을 포함한다.
product = " wireless-mouse-black "product 변수를 이용하여 아래 문자열을 생성하는 한 줄 코드를 작성하라.
Wireless Mouse Black문제 4
아래 문자열은 사용자 입력으로 받은 문장이다.
sentence = " \tPython---is---FUN---and---Python---is---powerful!\n "sentence 변수를 이용하여 아래 조건을 모두 만족하는 한 줄 코드를 작성하라.
양 끝의 화이트스페이스를 제거한다.
하이픈 세 개(
---)를 공백 하나로 바꾼다.모든 문자를 소문자로 바꾼다.
"python"을 "파이썬"으로 바꾼다.
최종 문자열이 "파이썬"으로 시작하는지 확인한다.
실행 결과는 True이어야 한다.
힌트: strip(), replace(), lower(), startswith() 메서드 연속 적용