텍스트는 프로그램이 처리해야 할 가장 일반적인 데이터 유형 가운데 하나입니다. 특히 파이선은 문자열을 다루는 많은 기능을 가지고 있습니다. 문자열 처리에 아주 최적화된 언어이기 때문입니다. 이미 + 연산자로 두 개의 문자열 값을 연결하는 방법을 알고 있지만 그보다 훨씬 더 많은 일을 할 수 있습니다. 문자열 값에서 부분 문자열을 추출할 수도 있고, 빈칸을 넣거나 뺄 수도 있으며, 글자를 소문자 또는 대문자로 변환하거나 문자열이 올바르게 지정되었는지 확인하는 문자로 변환, 추가하거나 빈칸을 제거할 수 있습니다.
파이선 문자열 다루기. 리얼파이선 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
참고
'개발자 > 파이썬 Python' 카테고리의 다른 글
파이선 자료구조 List 사용법. 리얼 파이선 13 (0) | 2022.02.22 |
---|---|
파이선 입력과 출력. 리얼파이선 12 (0) | 2022.02.17 |
파이선 서식 지정자와 출력 포맷팅. 리얼파이선 11 (0) | 2022.02.15 |
파이선 문자열 메소드 Method, 리얼파이선 10 (0) | 2022.02.10 |
파이선 함수. 리얼파이선 8 (0) | 2022.02.03 |
파이선 제어문 리얼파이선 7 (0) | 2022.01.28 |
파이선 연산 리얼파이선 6 (0) | 2022.01.26 |
파이선 변수. 리얼파이선 5 (0) | 2022.01.26 |
더욱 좋은 정보를 제공하겠습니다.~ ^^