파이썬 강좌 – 문자열 ~ 텍스트 다루기

  1. 프롤로그
  2. 개발 첫걸음
    1. 컴퓨터 구성요소 - 컴퓨터는 어떤 걸 할 수 있나?
    2. 개발과 관련된 용어
    3. 파이썬의 선택 - 왜 파이썬인가?
    4. 파이썬 설치 - Hello World 출력하기
    5. Visual Studio Code 의 편리한 기능
    6. REPL과 콘솔 창 - 파이썬 동작시키기
  3. 파이썬 기초
    1. 기초 입출력 - 소통하기
    2. 변수와 대입 - 기억하기
    3. 연산자 - 계산하기
    4. 조건문 - 분기를 만들기
    5. 반복문 - 비슷한 작업을 반복하기
    6. 변수와 리스트 - 비슷한 변수들을 묶기
    7. for, range - 리스트의 항목을 다루기
    8. 파이선 기초 꿀팁
      1. 함수와 메소드의 호출 - 편리한 기능 이용하기
      2. 모듈 설치와 사용 - 유용한 기능 끌어다 쓰기
      3. 문자열 - 텍스트 다루기
  4. 파이썬 중급
    1. 정규표현식 - 문자열을 검색하고 치환하기(작성중)
    2. 함수를 직접 만들기 - 자주 쓰는 기능을 묶기
    3. 딕셔너리, 튜플, 세트 - 변수를 다양한 방법으로 묶기
    4. 클래스와 객체 - 변수를 사람으로 진화시키기
    5. 상속 - 클래스를 확장하기
    6. 파이썬 중급 꿀팁
      1. 코드를 작성하는 사람의 의도(작성중)
      2. 정체성과 동질성 - 객체의 성질(작성중)
      3. 명령문, 표현식 - 문법을 이루는 것들 (작성중)
      4. 슬라이싱 - 리스트를 갖고 놀기
  5. 파이썬 고급
    1. 예외와 에러 - 예상치 못한 상황에 대응하기
    2. 특별 메소드와 연산자 - 파이썬의 내부 작동방식 이해하기
    3. 다양한 함수 인수 - 유연한 함수 만들기
    4. 시퀀스와 반복자 - 반복과 순회를 자유자재로 다루기
    5. 변수의 범위 - 이름 검색의 범위
  6. 파이썬 심화
    1. 제너레이터와 코루틴 -
    2. async와 await
    3. 데코레이터 - 함수의 기능을 강화하기
    4. 객체로서의 클래스 - 클래스를 동적으로 정의하기
  7. 파이썬 프로젝트 실습
    1. 원카드 게임 만들기 (1)
    2. 원카드 게임 만들기 (2)
  8. 실전 (파이썬 외적인 것들)
    1. 유니코드 - 컴퓨터에서 문자를 표기하는 방법
    2. html, css, 인터넷 - 자동화 첫 걸음 내딛기
    3. 네트워크 - 인터넷으로 통신하는 방법
    4. 문서 - 문맥을 읽어보기


이번 시간에는 문자열인 str 변수를 좀 더 편하게 사용해보겠습니다~


문자열 안에 특수 문자열 넣기

문자열은 크게 두 가지 표기법이 있습니다. 바로 '텍스트', "텍스트"와 같이 텍스트를 따옴표(') 혹은 쌍따옴표(")로 감싸주면 됩니다. 하지만 만약에 파이썬 문법의 일부나 따옴표 혹은 쌍따옴표 그 자체를 문자로 사용하고 싶다면 어떻게 될까요? 다음 예제를 봅시다.

print("문자열 내에서 if와 같은 키워드는 무시됩니다.")
print("여기는 따옴표'가 들어갈 수 있습니다.")
print('여기는 쌍따옴표 "가 들어갈 수 있습니다.')
print("여기서 쌍따옴표는 \"라고 써주면 됩니다.")
문자열 내에서 if와 같은 키워드는 무시됩니다.
여기는 따옴표''가 들어갈 수 있습니다.
여기는 쌍따옴표 "가 들어갈 수 있습니다.
여기서 쌍따옴표는 "라고 써주면 됩니다.

역슬래시(\) 문자를 통해서 우리는 쌍따옴표 안에 쌍따옴표를 넣을 수 있습니다. 역슬래시의 기능은 바로 뒤에 나오는 문자를 특수하게 처리하라는 뜻입니다. 즉 \"는 문자열을 닫는 문법적 역할 " 이 아닌 문자열 그 자체 "로 쓰겠다는 뜻입니다. 슬래시(/)가 아님을 주의해주세요. 백스페이스 근처에 있는 역슬래시입니다. 역슬래시는 폰트에 따라서 원화()로 표기되기도 하니 다르게 나온다고 해서 당황하시지 않아도 됩니다.


문자열과 for

for 안에 문자열을 넣을 수 있습니다. 이 때, 순회하는 변수는 문자열의 각 글자를 가리키게 됩니다.

for s in "안녕하세요":
    print(s)
안
녕
하
세
요

여러 줄에 걸친 문자열 (긴 주석)

파이썬에서는 여러 줄에 걸친 긴 문자열을 쓸 수 있습니다. 긴 문자열을 쓸 때에는 '''"""로 여러 줄에 걸친 문자열을 감싸주면 됩니다. 그 사이에 있는 모든 문자가 문자열이 되며, 줄바꿈 문자도 포함됩니다. 이는 아래 예시를 통해 확인하실 수 있습니다.

text = '''
abcd
efgh
ijkl
'''
print(text)

abcd
efgh
ijkl

긴 주석을 문법적으로 지원하지는 않지만 이 긴 문자열을 어느 변수에도 대입하지 않는 방식으로 긴 주석처럼 활용할 수 있습니다. 실제로 파이썬에서는 이런 식으로 작성된 문자열을 문서로 취급하여 텍스트 에디터에서 도움말을 불러올 때 등에 자동으로 연동될 수 있도록 합니다.

'''
이 프로그램은 OOO입니다.
어쩌구..저쩌구..
제작자 : something@naver.com
'''

f-string

정식 명칭은 포맷 문자열 리터럴이며, 포맷을 지정하기 편리한 문자열 작성법입니다. 작성법은 일반 문자열과 거의 비슷하나, 따옴표 혹은 따옴표로 시작하기 직전에 f를 붙이는 것이 다릅니다. f-string 내부에는 중괄호({})와 함께 변수나 값을 씁니다. 예제를 함께 보십시다. 중괄호 내에는 값이 계산될 수 있으므로 a + bround(a)와 같이 식으로 작성할 수도 있습니다.

number = 10
print("숫자는 " + str(number) + "입니다.")
print(f"숫자는 {number}입니다.") 
숫자는 10입니다.
숫자는 10입니다.

기존에는 우리가 문자열 사이에 변수를 집어넣으려면 + 연산자와 str 내장 함수를 활용했어야 했습니다. 하지만 f-string을 이용하면 아주 쉽게 변수의 값을 끌어다 쓸 수 있다는 것을 확인하실 수 있습니다.


f-string에는 한층 더 편리한 기능이 있는데요, {} 내부에 있는 실제 코드와 함께 출력하고 싶다면 }로 닫기 전에 =를 넣으면 됩니다. 여기서의 등호는 대입문의 등호와 전혀 연관이 없습니다! 단지 f-string의 부가적인 사용법이라고 생각해주세요. 역시 예제를 확인합시다. 아래 3개의 print 문은 똑같은 결과를 출력합니다.

num = 14.73
print("round 예제 >> round(num) = " + str(round(num)))
print(f"round 예제 >> round(num) = {round(num)}")
print(f"round 예제 >> {round(num) = }")
round 예제 >> round(num) = 15
round 예제 >> round(num) = 15
round 예제 >> round(num) = 15

이제부터 각종 에제에는 f-string을 적극적으로 사용할 예정이니 갑자기 이상한 문법이 나왔다고 해서 당황해주시지 말아 주세요~


편리한 메소드

파이썬 자체적으로 제공하는 편리한 str 메소드가 많습니다. 메소드를 호출하는 방법은 크게 두 가지가 있습니다.

  • 따옴표 혹은 쌍따옴표 뒤에 바로 호출하기
"1324132121".count("1")
  • 변수에 값을 넣어서 호출하기
tem = "{}야, 잘 잤니?"
result = tem.format("철수")

이제 주로 사용되는 메소드나 기능을 알아보도록 합시다.


포매팅

  • 사용법 : str.format(t1, t2, ...)

  • 설명 : 해당 문자열의 포함된 필드를 차례로 치환합니다. 필드는 {}로 만들 수 있습니다. 일종의 템플릿을 만들어놓고 재사용하고자 할 때 유용합니다.

  • 예제

template = "학생의 이름은 {}이고 점수는 {}입니다"
print(template.format("태훈", 98))
print(template.format("팽수", 50))
학생의 이름은 태훈이고 점수는 98입니다
학생의 이름은 팽수이고 점수는 50입니다

위 예제의 template 변수에서 {}는 총 2개가 등장합니다. 그에 따라 format 메소드를 호출할 때 2개의 인수를 받는다는 걸 확인할 수 있습니다. ({}가 더 많이 등장한다면 인수도 더 많이 받을 것입니다.) "태훈"은 앞쪽의 {}에 대응되고 98은 뒤쪽의 {}에 대응됩니다.

일단 format 메소드에 대한 가장 기본적인 사용법에 대해 알려드렸으나, 실은 이 메소드의 사용법은 굉장히 방대하므로 공식 문서 혹은 다른 리소스도 찾아보시면 좋겠습니다.


검사 및 체크

사용법 설명
a in text in 연산자는 리스트와 마찬가지로 내부에 문자열이 포함되어 있는지 여부에 대해 검사합니다.
text.startswith(a) text의 시작 부분이 a로 시작하는지에 대한 여부를 검사합니다.
text.endswith(a) text의 끝 부분이 a로 끝나는지에 대한 여부를 검사합니다.
text.isdigit() text가 숫자로 이루어진 수인지를 판단합니다.
  • 예제
text = "Do you wanna build a snowman?"
print(f"{text=}")
print(f"{'build' in text=}")
print(f"{'knock' in text=}")
print(f"{text.startswith('Do')=}")
print(f"{text.startswith('you')=}")
print(f"{text.endswith('?')=}")
print(f"{text.endswith('!')=}")
print(f"{'42'.isdigit()=}")
print(f"{text.isdigit()=}")
text='Do you wanna build a snowman?'
'build' in text=True
'knock' in text=False
text.startswith('Do')=True
text.startswith('you')=False
text.endswith('?')=True
text.endswith('!')=False
'42'.isdigit()=True
text.isdigit()=False

접근 및 탐색

다음 메소드들은 문자열 내 포함된 문자열에 대해 접근하거나 탐색합니다. 어떤 문자열이 포함되어 있는지 여부만 검사한다면 in 연산자를 사용하는 게 더 편리합니다.

사용법 설명
text[i] 문자열에서 인덱스 i에 있는 문자 하나에 접근합니다. 리스트와 마찬가지로 첫 번째 글자는 text[0] 입니다.
text.count(a) 문자열에서 a가 등장하는 횟수를 반환합니다.
text.find(a) 문자열에서 a가 등장하는 곳의 인덱스를 반환합니다. a가 여러 번 등장한다면 가장 첫 번째의 인덱스를 반환합니다. a가 없으면 -1을 반환합니다.
text.index(a) find와 유사하지만 찾을 수 없는 경우에는 에러를 일으킵니다.
  • 예시
text = "Do you wanna build a snowman?"
print(f"{text=}")
print(f"{text[3]=}")
print(f"{text.count('a')=}")
print(f"{text.count('nothing')=}")
print(f"{text.find('build')=}")
print(f"{text.find('nothing')=}")
print(f"{text.index('wanna')=}")
print(f"{text.index('nothing')=}")
text='Do you wanna build a snowman?'
text[3]='y'
text.count('a')=4
text.count('nothing')=0
text.find('build')=13
text.find('nothing')=-1
text.index('wanna')=7
Traceback (most recent call last):
  File "c:/Users/tooth/Desktop/test.py", line 9, in <module>
    print(f"{text.index('nothing')=}")
ValueError: substring not found

조작

다음 메소드들은 텍스트를 수정하거나 조작하는 데 좋습니다. 다만 모든 메소드는 수정된 텍스트가 새로 생성되어 반환되는 식으로 작동합니다. 단순히 메소드 호출만 하여서는 변경사항이 적용되지 않으므로 대입문을 별도로 써주어야 합니다.

사용법 설명
text.partition(a) 문자열에서 a를 찾습니다. 처음 발견되는 a를 기준으로 왼쪽, a 그 자체, a를 기준으로 오른쪽, 이렇게 세 부분으로 나누어 튜플로 반환합니다. (튜플이란 일단 고정된 리스트라고 생각해주세요. 자세한 내용은 튜플(추가 예정)에서 알아봅시다.)
text.split(a) 또는 text.split(a, b) 문자열에서 a를 구분자로 정하여, 문자열에 있는 단어들의 리스트를 반환합니다. b가 주어지면 최대 b 번의 분할이 수행됩니다.
text.replace(a, b) 또는 text.replace(a, b, c) 문자열 내 모든 ab로 치환합니다. c가 주어질 경우 최대 c 번의 치환이 수행됩니다.
text.strip() 또는 text.strip(a) 문자열 앞 뒤의 공백을 제거합니다. a가 주어질 경우 a에 포함되는 모든 문자에 대해서 text 앞 뒤의 문자들을 제거합니다.
text.join(l) l은 리스트입니다. text를 구분자로 이용하여 l의 모든 요소를 합쳐서 하나의 문자열을 반환합니다. "".join(l)은 구분자 없이 l의 모든 요소를 합칩니다.
  • 예제
text = "Do you wanna build a snowman?"
print(f"{text.partition('wanna')=}")
print(f"{text.partition('nothing')=}")
print(f"{text.split(' ')=}")
print(f"{text.split('nothing')=}")
print(f"{text.replace('build', 'throw')=}")
print(f"{text.replace('nothing', 'done')=}")
print(f"{'  하이    '.strip()=}")
print(f"{text.strip('Do?anmw')=}")
print(f"text는 수정되지 않았습니다. >> {text}")

l = ['1','하이','파워','국어']
print(f"{l=}")
print(f"{''.join(l)=}")
print(f"{', '.join(l)=}")
text.partition('wanna')=('Do you ', 'wanna', ' build a snowman?')
text.partition('nothing')=('Do you wanna build a snowman?', '', '')
text.split(' ')=['Do', 'you', 'wanna', 'build', 'a', 'snowman?']
text.split('nothing')=['Do you wanna build a snowman?']
text.replace('build', 'throw')='Do you wanna throw a snowman?'
text.replace('nothing', 'done')='Do you wanna build a snowman?'
'  하이    '.strip()='하이'
text.strip('Do?anmw')=' you wanna build a s'
text는 수정되지 않았습니다. >> Do you wanna build a snowman?
l=['1', '하이', '파워', '국어']
''.join(l)='1하이파워국어'
', '.join(l)='1, 하이, 파워, 국어'

인덱스 기반으로 text의 부분 문자열을 가져오는 슬라이싱은 차후 시간에 설명합니다. (추가 예정)


위에서 설명했던 메소드들은 자주 쓰는, 혹은 초보자들이 쓰기에 알맞은 메소드를 추린 것입니다. 더 자세하게 알고 싶다면 아래 링크를 참조해주세요.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

Scroll to top