개발자/파이썬 Python

파이선 문자열 다루기. 리얼파이선 9

지구빵집 2022. 2. 8. 15:01
반응형

 

 

 

텍스트는 프로그램이 처리해야 할 가장 일반적인 데이터 유형 가운데 하나입니다. 특히 파이선은 문자열을 다루는 많은 기능을 가지고 있습니다. 문자열 처리에 아주 최적화된 언어이기 때문입니다. 이미 + 연산자로 두 개의 문자열 값을 연결하는 방법을 알고 있지만 그보다 훨씬 더 많은 일을 할 수 있습니다. 문자열 값에서 부분 문자열을 추출할 수도 있고, 빈칸을 넣거나 뺄 수도 있으며, 글자를 소문자 또는 대문자로 변환하거나 문자열이 올바르게 지정되었는지 확인하는 문자로 변환, 추가하거나 빈칸을 제거할 수 있습니다.

 

파이선 문자열 다루기. 리얼파이선 9 

 

텍스트를 복사하거나 붙여 넣기 위해 클립보드를 사용하는 파이선 코드를 만들 수도 있습니다. 여기서 문자열을 다루는 모든 기능을 익히시기 바랍니다. 함수는 반드시 기능을 실습하시기 바랍니다. 기본 문자열 응용 방법을 배우고 두 개의 프로젝트를 진행해볼 것인데, 첫 번째는 간단한 암호 관리자이며 두 번째는 몇 가지 텍스트를 서식화하는 지루한 잡일을 자동화하는 프로그램을 살펴볼 것입니다.

 

문자열 리터럴 String Literals 

 

이전에 문자열에 대해 배웠던 것을 잠깐 복습하는 의미로 아래 코드를 실습합니다.

 

숫자와는 별개로, 파이썬은 문자열도 다룰 수 있는데 여러 가지 방법으로 표현됩니다. 작은따옴표('...') 나 큰따옴표("...")로 둘러쌀 수 있는데 모두 같은 결과를 나타냅니다. 

 

>>> spam = "That is Alice's cat."

 

이스케이프 문자

 

다른 언어들과는 달리, \n 과 같은 특수 문자들은 작은따옴표('...')와 큰따옴표("...")에서 같은 의미가 있습니다. 둘 간의 유일한 차이는 작은따옴표 안에서 " 를 \(역 슬래쉬)를 사용할 필요가 없지만 아래 경우처럼 작은따옴표 안에서 ' 를 사용할 경우 \ 이스케이프 문자를 사용해야 합니다. 

 

>>> spam = 'Say hi to Bob\'s mother.'

 

이스케이프 코드란?

 

문자열 예제에서 여러 줄의 문장을 처리할 때 백슬래시 문자와 소문자 n을 조합한 \n 이스케이프 코드를 사용했다. 이스케이프 코드란 프로그래밍할 때 사용할 수 있도록 미리 정의해 둔 "문자 조합"이다. 주로 출력물을 보기 좋게 정렬하는 용도로 사용한다. 몇 가지 이스케이프 코드를 정리하면 다음과 같다. 

 

코드 설명

\n 문자열 안에서 줄을 바꿀 때 사용
\t 문자열 사이에 탭 간격을 줄 때 사용
\\ 문자 \를 그대로 표현할 때 사용
\' 작은따옴표(')를 그대로 표현할 때 사용
\" 큰따옴표(")를 그대로 표현할 때 사용
\r 캐리지 리턴(줄 바꿈 문자, 현재 커서를 가장 앞으로 이동)
\f 폼 피드(줄 바꿈 문자, 현재 커서를 다음 줄로 이동)
\a 벨 소리(출력할 때 PC 스피커에서 '삑' 소리가 난다)
\b 백 스페이스
\000 널 문자

이 중에서 활용 빈도가 높은 것은 \n, \t, \\, \', \"이다. 나머지는 프로그램에서 잘 사용하지 않는다.

 

적적한 문자열 사용 예를 참고하세요.

 

>>> 'spam eggs'  # single quotes
'spam eggs'

>>> 'doesn\'t'  # use \' to escape the single quote...
"doesn't"

>>> "doesn't"  # ...or use double quotes instead
"doesn't"

>>> '"Yes," they said.'
'"Yes," they said.'

>>> "\"Yes,\" they said."
'"Yes," they said.'

>>> '"Isn\'t," they said.'
'"Isn\'t," they said.'

 

대화형 인터프리터에서, 출력 문자열은 따옴표로 둘러싸여 있고, 특수 문자들은 역 슬래시로 이스케이핑 됩니다. 때로 입력한 것과 달라 보여도 (따옴표의 종류가 바뀔 수 있다), 두 문자열은 동등합니다. 문자열이 작은따옴표를 포함하고 큰따옴표를 포함하지 않으면 큰따옴표가 사용되고, 그 외의 경우는 작은따옴표가 사용됩니다. print() 함수는 따옴표를 생략하고, 이스케이핑된 특수 문자를 출력해서 더 읽기 쉬운 출력을 만들어냅니다:

 

>>> '"Isn\'t," they said.'
'"Isn\'t," they said.'

>>> print('"Isn\'t," they said.')
"Isn't," they said.

>>> s = 'First line.\nSecond line.'  # \n means newline

>>> s  # without print(), \n is included in the output
'First line.\nSecond line.'

>>> print(s)  # with print(), \n produces a new line
First line.
Second line.

 

\ 뒤에 나오는 문자가 특수 문자로 취급되게 하고 싶지 않다면, 첫 따옴표 앞에 r 을 붙여서 날 문자열 (raw string) 을 만들 수 있습니다:

 

>>> print('C:\some\name')  # here \n means newline!
C:\some
ame
>>> print(r'C:\some\name')  # note the r before the quote
C:\some\name

 

문자열 리터럴은 여러 줄로 확장될 수 있습니다. 한 가지 방법은 삼중 따옴표를 사용하는 것입니다: """...""" 또는 '''...'''. 줄 넘김 문자는 자동으로 문자열에 포함됩니다. 하지만 줄 끝에 \ 를 붙여 이를 방지할 수도 있습니다. 다음 예:

 

print("""\
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
""")

 

는 이런 결과를 출력합니다 (첫 번째 개행 문자가 포함되지 않는 것에 주목하세요):

 

Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to

 

문자열은 + 연산자로 이어 붙이고, * 연산자로 반복시킬 수 있습니다:

 

>>> # 3 times 'un', followed by 'ium'
>>> 3 * 'un' + 'ium'
'unununium'

 

두 개 이상의 문자열 리터럴 (즉, 따옴표로 둘러싸인 것들) 가 연속해서 나타나면 자동으로 이어 붙여집니다.

 

>>> 'Py' 'thon'
'Python'

 

이 기능은 긴 문자열을 쪼개고자 할 때 특별히 쓸모 있습니다:

 

>>> text = ('Put several strings within parentheses '
...         'to have them joined together.')
>>> text
'Put several strings within parentheses to have them joined together.'

 

이것은 오직 두 개의 리터럴에만 적용될 뿐 변수나 표현식에는 해당하지 않습니다:

 

>>> prefix = 'Py'
>>> prefix 'thon'  # can't concatenate a variable and a string literal
  File "<stdin>", line 1
    prefix 'thon'
                ^
SyntaxError: invalid syntax
>>> ('un' * 3) 'ium'
  File "<stdin>", line 1
    ('un' * 3) 'ium'
                   ^
SyntaxError: invalid syntax

 

변수들끼리 혹은 변수와 문자열 리터럴을 이어 붙이려면 + 를 사용해야 합니다

 

>>> prefix + 'thon'
'Python'

 

문자열은 인덱스 (서브 스크립트) 될 수 있습니다. 첫 번째 문자가 인덱스 0에 대응됩니다. 문자를 위한 별도의 형은 없습니다; 단순히 길이가 1인 문자열입니다:

 

>>> word = 'Python'
>>> word[0]  # character in position 0
'P'
>>> word[5]  # character in position 5
'n'

 

인덱스는 음수가 될 수도 있는데, 끝에서부터 셉니다:

 

>>> word[-1]  # last character
'n'
>>> word[-2]  # second-last character
'o'
>>> word[-6]
'P'

 

-0은 0과 같으므로, 음의 인덱스는 -1에서 시작한다는 것에 주목하세요.

 

인덱싱에 더해 슬라이싱(slicing) 도 지원됩니다. 인덱싱이 개별 문자를 얻는 데 사용되는 반면, 슬라이싱 은 부분 문자열(substring)을 얻는 데 사용됩니다:

 

>>> word[0:2]  # characters from position 0 (included) to 2 (excluded)
'Py'
>>> word[2:5]  # characters from position 2 (included) to 5 (excluded)
'tho'

 

슬라이스 인덱스는 편리한 기본값을 갖고 있습니다; 첫 번째 인덱스를 생략하면 기본값 0 이 사용되고, 두 번째 인덱스가 생략되면 기본값으로 슬라이싱 되는 문자열의 길이가 사용됩니다.

 

>>> word[:2]   # character from the beginning to position 2 (excluded)
'Py'
>>> word[4:]   # characters from position 4 (included) to the end
'on'
>>> word[-2:]  # characters from the second-last (included) to the end
'on'

 

시작 위치의 문자는 항상 포함되는 반면, 종료 위치의 문자는 항상 포함되지 않는 것에 주의하세요. 이 때문에 s[:i] + s[i:] 는 항상 s 와 같아집니다

 

>>> word[:2] + word[2:]
'Python'
>>> word[:4] + word[4:]
'Python'

 

슬라이스가 동작하는 방법을 기억하는 한 가지 방법은 인덱스가 문자들 사이의 위치를 가리킨다고 생각하는 것입니다. 첫 번째 문자의 왼쪽 경계가 0입니다. n 개의 문자들로 구성된 문자열의 오른쪽 끝 경계는 인덱스 n 이 됩니다, 예를 들어:

 

 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
 0   1   2   3   4   5   6
-6  -5  -4  -3  -2  -1

 

첫 번째 숫자 행은 인덱스 0…6 의 위치를 보여주고; 두 번째 행은 대응하는 음의 인덱스들을 보여줍니다. i 에서 j 범위의 슬라이스는 i 와 j 로 번호 붙여진 경계 사이의 문자들로 구성됩니다.

 

음이 아닌 인덱스들의 경우, 두 인덱스 모두 범위 내에 있다면 슬라이스의 길이는 인덱스 간의 차입니다. 예를 들어 word[1:3] 의 길이는 2입니다.

 

너무 큰 값을 인덱스로 사용하는 것은 에러입니다:

 

>>> word[42]  # the word only has 6 characters
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range

 

하지만, 범위를 벗어나는 슬라이스 인덱스는 슬라이싱할 때 부드럽게 처리됩니다:

 

>>> word[4:42]
'on'
>>> word[42:]
''

 

파이썬 문자열은 변경할 수 없다 — 불변이라고 합니다. 그래서 문자열의 인덱스로 참조한 위치에 대입하려고 하면 에러를 일으킵니다:

 

>>> word[0] = 'J'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

>>> word[2:] = 'py'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

 

다른 문자열이 필요하면, 새로 만들어야 합니다.

 

>>> 'J' + word[1:]
'Jython'
>>> word[:2] + 'py'
'Pypy'

 

내장 함수 len() 은 문자열의 길이를 돌려줍니다:

 

>>> s = 'supercalifragilisticexpialidocious'
>>> len(s)
34

 

참고

문자열 응용하기-코딩 도장

파이선 자습서 문자열

점프 투 파이선 문자열 자료형 

 

 

문자열 조작하기

 

 

 

반응형