Python

[Python] 문자열 연산, len(), count(), indexing

ruming 2023. 10. 17. 17:23

문자열을 만드는 방법 4가지

'Hello World'
"Hello World"
'''Hello World'''
"""Hello World"""

 

'''과 """은 주석으로만 쓰이는 줄 알았는데 아니었다.

변수에 넣어주면 문자열이 되고, 그렇지 않으면 주석으로 처리되는 것 같다.

문자열이 여러 줄인 경우 사용하면 된다.

문자열과 주석 실험

s1과 s3은 문자열로 처리, 7~9번째 줄은 주석으로 처리되었다.

참고로 파이썬은 들여쓰기에 민감하기 때문에 함수 내부에서 주석을 사용할 때는 주석도 들여쓰기를 해줘야 한다.

 

문자열 연산

문자열끼리 덧셈과 곱셈이 가능하다.

덧셈은 문자열을 이어서 출력하고, 곱셈은 곱한 수 만큼 출력해준다.

 

[문자열 덧셈]

s1 = "Hello World! "
s2 = "My name is Python! "
print(s1+s2)
print(s1+s1)
print(s1+"String Test")

문자열 덧셈 결과

여러 번 덧셈하는 것도 가능하고, 변수가 아닌 문자열을 덧셈하는 것도 가능하다.

문자열과 상수를 덧셈하는 것은 불가능하다. (s1+3)

 

[문자열 곱셈]

s1 = '''Hello World! '''
s2 = "My name is Python! "
print(s1*3)
print(s2*4)

문자열 곱셈 결과

문자열끼리의 곱셈은 안 된다. (s1*s2)

 

문자열 길이 세기 - len()

len은 문자열의 길이를 세는 함수다. (공백 포함)

사용방법: len(변수명)
s1 = '''Hello World! '''
s2 = "My name is Python! "
print("s1의 길이 : ", len(s1))
print("s2의 길이 : ", len(s2))

문자열 길이 세기

s1의 길이는 13이다.

1 2 3 4 5 6 7 8 9 10 11 12 13
H e l l o   W o r l d !  

 

문자열 개수 세기 - count()

count는 특정한 문자열의 개수를 센다.

사용방법: 변수명.count("찾고자 하는 문자열")
s1 = 'Hello World! '
s2 = "yes yes yes very yes"
print("Hello의 개수 : ", s1.count('Hello'))
print("yes의 개수 : ", s2.count("yes"))

문자열 개수 세기

공백의 개수를 세는 것도 가능하다.

 

문자열 인덱싱 (Indexing), 슬라이싱 (Slicing)

인덱싱을 사용해 문자열의 특정 부분을 가져올 수 있다.

인덱싱은 0부터 시작한다. "Hello World! " 문자열의 경우 0~12까지의 인덱스를 가지고 있다.

0 1 2 3 4 5 6 7 8 9 10 11 12
-13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
H e l l o   W o r l d !  

s1 = "Hello World! "라고 했을 때, s1[0]과 같은 방법으로 사용할 수 있는데, s1[0]은 s1의 가장 첫번째 문자인 

'H'를 의미한다. n번째와 인덱스 n을 헷갈리지 말자. 보통 n번째를 가리키는 경우 인덱스는 n-1이다. (예: 5번째 문자를 찾고 싶을 경우 s1[4] = 'o')

인덱스는 마이너스 부호도 가능하다. s1[-1]은 s1[12]와 같은 값을 의미한다. 즉, -는 문자열을 끝값부터 가리킨다. s1[-1] = s1[12], s1[-2] = s1[11] ···.

 

또한 슬라이싱 기법을 이용하면 문자열의 특정 부분을 가져올 수 있다.

'Hello World! '에서 'Hello'만 뽑아 오고 싶다면 s1[0:5]로 표현할 수 있다. 0:5에서 5는 포함하지 않아 실제로는 0,1,2,3,4 부분을 가져온다.

print("문자열 인덱싱: ", s1[0], s1[3], s1[-3], s1[-5])
#문자열 슬라이싱
print("문자열 슬라이싱: ", s1[3:8]) # 인덱스 3~7까지 가져옴
print("Hello World!에서 Hello만 가져오기: ", s1[0:5])
print("인덱스 4부터 끝까지 출력하기: ", s1[4:]) # 인덱스 4부터 끝까지 가져옴

문자열 인덱싱 결과

 

마이너스 기호를 포함한 인덱싱을 살펴보자.

필자는 처음에 +와 - 기호가 혼합된 슬라이싱 기법이 어떻게 이루어지는지 이해가 안 됐는데, 아래 표처럼 +든 -든 각 위치로 확인하면 간단할 것 같다.

0 1 2 3 4 5 6 7 8 9 10 11 12
-13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
H e l l o   W o r l d !  

예를 들어, s1[7:-3]으로 슬라이싱을 한다고 치자.

필자는 처음에 슬라이싱이 7,8,9,10 ··· -6, -5, -4 이렇게 이루어지는 줄 알아 이해가 안 되었다.

그런데 생각해보면 위처럼 슬라이싱을 하게 될 경우 문자열이 겹쳐버린다.

orld! Hello Worl <- 이렇게 출력이 될 것이다.

하지만 실제로는 orl <- 이렇게 출력이 된다. 그냥 -4 위치까지 슬라이싱이 된 것이다. 값 자체만 보자면 s1[7:10] 결과와 똑같다. 그러니까 s1[7:-12] 이런 값을 출력해보면 값이 안 나온다. 거꾸로 가져오지 않는 이상은 말이다.

 

슬라이싱은 값을 거꾸로 가져오거나 건너뛰어서 가져오는 것도 가능하다.

변수명[시작번호:끝번호:슬라이싱 단위]

-1로 하면 거꾸로 가져올 수 있는데, 아까처럼 s1[7:-12]는 출력이 안 되지만 s1[7:-12:-1]은 7부터 -11까지 슬라이싱하기 때문에 출력이 가능하다. 슬라이싱은 그냥 해당 인덱스 번호까지 앞뒤 방향을 잘라오는 걸로 이해하면 된다.

 

print("마이너스 값을 포함한 슬라이싱: ", s1[-7:])
print("마이너스 값을 포함한 슬라이싱: ", s1[-11:-2])
print("마이너스 값을 포함한 슬라이싱: ", s1[7:-3])
print("마이너스 값을 포함한 슬라이싱: ", s1[7:-12:-1])
print("증가폭이 2인 슬라이싱: ", s1[1:12:2])

[참고자료]

점프 투 파이썬 - 02장 파이썬 프로그래밍의 기초, 자료형 - 02-2 문자열 자료형