파이썬을 배워보자 3일차 - 문자열

0

Python

목록 보기
3/18

점프 투 파이썬 : https://wikidocs.net/book/1
파이썬 기본을 갈고 닦자 : https://wikidocs.net/16031

문자열 자료형

1. 문자열

파이썬은 문자열을 지원한다. 문자열은 Unicode로 이루어진 불변하고 순서가 있는 집합니다. 즉 불변하기 때문에 특정 문자만 바꾸는 것이 불가능하다.

문자열은 '', ""으로 표현 가능하며, 문자와 문자열을 구분하지 않는다.

1.1 문자열 만들기

  1. 큰 따옴표(")로 둘러싸기
"Hello World"
  1. 작은 따옴표(')로 둘러싸기
'Hello World'
  1. 큰 따옴표 3개를 연속으로써 둘러싸기
"""Hello World"""
  1. 작은 따옴표 3개를 연속으로써 둘러싸기
'''Hello Wolrd'''

참고로 3개를 연속으로써서 둘러싸기를 하면 여러 줄의 문자열을 받을 수 있다는 장점이 있다.

a = """
    hello my name is gyu
    life is long
    and my house is so 
    sweet
    """

print(a)
#    hello my name is gyu
#    life is long
#    and my house is so 
#    sweet

1.2 큰 따옴표안에 작은 따옴표가 들어 갈 수 있고, 작은 따옴표안에 큰 따옴표가 들어갈 수 있다.

print("hello my name is 'gyu'") # hello my name is 'gyu'
print('hello my name is "gyu"') # hello my name is "gyu"

이렇게 작은 따옴표와 큰 따옴표를 문자열 안에 넣을 수 있다.

이런 방법말고도 백슬래시(\)를 이용하여 넣을 수도 있다. 문자열 사이에 \' , \" 를 넣으면 된다.

a = " hello!! my name is \"gyu\" ! \'nice\' "
print(a) #  hello!! my name is "gyu" ! 'nice' 

1.3 문자열 합치기

문자열을 합치기 위해서는 문자열 + 문자열을 해도되지만, 문자열 리터럴을 나란히 두어도 된다.

a = "hello"
b = "world"
print(a + b) # helloworld

print("hello" "world") # helloworld

위의 print는 + 을 이용하여 합치는 경우이고, 아래는 문자열을 나란히 쓰면 합쳐지는 경우를 말한다.

이때문에 리스트에 문자열을 넣을 때 ,로 분리해주지 않으면 문제가 발생할 수 있다.

a = [ "hello " "block" , "chain"]
print(a) # ['hello block', 'chain']

"hello block"이 된 것을 확인할 수 있다.

이렇게 백슬래쉬(\)와 소문자를 조합하여 여러가지 특수한 기능들을 사용할 수 있다. 가령 줄바꿈인 이스케이프 코드는 \n으로 쑬 수 있다.

  1. \n : 줄바꿈
  2. \t : 탭 간격
  3. \\ : \ 출력
  4. \' : 작은 따옴표 사용
  5. \" : 큰 따옴표 사용
  6. \r : 캐리지 리턴
  7. \f : 폼피드
  8. \a : 벨소리
  9. \b : 백스페이스
  10. \000 : 널 문자

등이 있다.

1.4 문자열 곱하기

문자열을 곱하면 해당 문자열을 반복하는 문자열을 새로 만들어준다.

a = "Hello"
print( a * 3)  # HelloHelloHello

1.5 문자열 길이 구하기

문자열의 길이는 다음과 같이 len 함수를 이용하여 구할 수 있다.

a = "Hello"
print( len(a) ) # 5

시간복잡도가 O(N)이기 때문에 문자열 길이를 어디 저장해놓고 쓰는 것이 좋다.

1.6 문자열 인덱싱과 슬라이싱

문자열도 리스트처럼 인덱싱을 할 수 있다. 단, 불변성을 지니는 것을 명심하도록 하자, 즉 특정한 값을 다른 값으로 변환하는 것은 불가능하다.

a = "Hello"
print(a[0], a[1] , a[2], a[3], a[4]) # H e l l o
print(a[-1], a[-2] , a[-3], a[-4], a[-5]) # o l l e H
a[0] = "w" # TypeError: 'str' object does not support item assignment
print(a)

문자열을 앞으로 쭉 보면 0 ~ len(a) -1까지 이다. 뒤에부터 보는 방법은 음수 인덱스로 접근하는 것인데 맨 끝에서부터 -1 , -2 ... 로 된다.

문자열:    H    E   L   L   O
순방향:    0    1   2   3   4
역방향:    -5  -4  -3   -2  -1 

이렇게 되었다고 보면 된다. 참고로 a[-0]은 a[0]과 같다. 또한, a[2] ='3'과 같이 특정 인덱스의 문자를 바꾸는 것도 불가능하다. 이는 파이썬의 문자열이 불변이기 때문이다. 즉 새로 만드는 수 밖에 없다.

1.7 문자열 슬라이싱

문자열 슬라이싱은 해당 문자열의 특정 부분들을 쭉 슬라이스해와서 새로운 문자열을 만드는 것을 말한다.

newLine = a[ : ] # 처음부터 끝까지
newLine = a[ : end] # 처음부터 end-1까지
newLine = a[start : ] # start부터 끝까지
newLine = a[start : end] # start부터 end-1끝까지
newLine = a[start : end : step] # start부터 step만끔 뛰어서 end까지

사용 방법은 위와 같다.

문자열:    H    E   L    L   O   M   Y   N   A   M   E
순방향:    0    1   2    3   4   5   6   7   8   9   10
역방향:   -11  -10  -9  -8  -7  -6  -5  -4  -3  -2  -1  

예제들로 다음과 같은 것들이 있다.

a = "HelloMyName"
print(a[:]) # HelloMyName
print(a[1:]) # elloMyName
print(a[:3]) # Hel
print(a[1:3]) # el
print(a[5:10]) # MyNam
print(a[1:10:2]) # elMNm
print(a[3:-1]) # loMyNam

음수 인덱싱을 이용하여 슬라이스도 할 수 있다는 점에 유의하도록 하자, 물론 필자는 가독성이 별로 맘에 들지않아 정말 귀찮을 때가 아니면 잘 안쓴다.

슬라이싱은 굉장히 다양하게 사용되고, 많이 사용된다. 이를 이용하여 많은 것들을 구현할 수 있는데 한 가지가 특정한 문자를 바꾸어 새 문자열로 반환해주는 것을 만들 수 있다.

가령 "HelloMyName"에서 eE로 바꾸고 싶다고 하자. 우리는 a[1] = 'E'라고 하고 싶지만 안된다는 것을 위에서 확인했다.

그래서 슬라이싱을 통해 잘라내고 새로운 문자열을 만들어내는 것이다.

a = "HelloMyName"
a = a[:1] + 'E' + a[2:]
print(a) # HElloMyName

다음과 같이 슬라이싱하여 새로운 문자열을 만들어낼 수 있다.

1.8 format 함수를 사용한 포매팅

문자열의 .format메서드를 사용하면 문자열 포맷을 지정할 때 굉장히 편하게 할 수 있다. 문자가 들어갈 곳은 {순서}로 넣고, 값은 foramt(순서)안에 순서대로 넣어준다.

num = 3
dessert = "ice cream"
a ="I eat {0} apples and some {1} dessert".format(num, dessert)
print(a) # I eat 3 apples and some ice cream dessert

이렇게 순서대로 넣는 것이 아닌, 이름을 지정해서 넣을 수도 있다.

num = 3
dessert = "ice cream"
a ="I eat {num} apples and some {name} dessert".format(num=num, name=dessert)
print(a) # I eat 3 apples and some ice cream dessert

실수의 경우 소수점 몇 번째 값까지만 나타낼 지도 정의할 수 있다.

a = 4.894657
print("hello your score is {0:0.4f}".format(a)) # hello your score is 4.8947

{0:0.4f}에서 0.4의 0은 몇 칸을 차지할지, x.4는 4번째 소수점을 반올림할 지를 나타낸다.

문자열을 가운데 정렬하거나, 왼쪽 오른쪽 정렬도 가능하다.

num = 10
print("hello i'm {0:^10}!".format(num)) # hello i'm     10    !
print("hello i'm {0:>10}!".format(num)) # hello i'm         10!
print("hello i'm {0:<10}!".format(num)) # hello i'm 10        !

{순서:정렬자 칸수}를 말한다. 정렬로 ^은 가운데 정렬 >은 오른쪽 정렬 <은 왼쪽 정렬을 말한다. 또한, 그 오른쪽에 있는 숫자는 몇 칸을 차지할지를 나타낸다. 정렬자 앞에 어떤 문자를 넣으면 공백을 그 문제로 채워준다.

num = 10
print("hello i'm {0:z^10}!".format(num)) # hello i'm zzzz10zzzz!

이렇게 된다.

1.9 f문자열 포맷팅

파이썬 3.6버전부터 사용할 수 있다. 3.6 미만은 사용할 수 없으니 주의하도록 하자. 문자열 앞에 f를 쓰고 {변수}로 적으면 자동으로 해당 값이 들어간다.

age = 10
name ="gyu"
print(f"hello! my name is {name} and i'm {age}") # hello! my name is gyu and i'm 10

format 포매팅에 비해 훨씬 간단한 것을 확인할 수 있다.

또한, f문자열 포맷팅은 표현식을 지원한다. 표현식은 문자열 안에서 변수와 +, - 와 같은 수식을 함계 사용하는 것을 말한다.

age = 10
name ="gyu"
print(f"hello! my name is {name} and i'm {age+20}") # hello! my name is gyu and i'm 30

{age + 20}과 같은 것이 가능하다. 또현 딕셔너리 도 사용할 수 있다.

위의 format과 마찬가지로 정렬도 사용할 수 있다.

age = 10
name ="gyu"
print(f"hello! my name is {name} and i'm {age+20:^10}!") # hello! my name is gyu and i'm     30    !

2. 문자열 관련 메서드

문자열은 다양한 메서드를 가지고 있는데, 모두 외워서 쓰기에는 힘들다. 그냥 이런게 있구나 정도만 알아도 된다.

2.1 count 메서드

count는 해당 문자열에서 입력으로 들어간 단어가 몇 번 나왔는 지를 반환해주는 메서드이다.

a = "hooby"
print(a.count('oo')) # 1
print(a.count('o')) # 2

2.2 find, index

find와 index 둘 다 찾으려는 단어가 어디에 있는 지 알려주는 메서드이다. 단, find의 경우에는 찾으려는 단어가 해당 문자열에서 없는 경우 -1을 반환하고, index는 error를 일으킨다.

a = "hooby"
print(a.find('ob')) # 2
print(a.find('o')) # 1
print(a.find("gyu")) # -1

print(a.index('ob')) # 2
print(a.index('o')) # 1
print(a.index("gyu")) # ValueError: substring not found

2.3 join

문자열을 삽입하는 메서드로 특정 문자열을 문자 사이사이에 넣어주는 기능을 한다. 주의 할 것은 원본 문자열을 바꾸는 것이 아닌 새로운 문자열을 반환한다는 것이다.

print("[done]".join("hello")) # h[done]e[done]l[done]l[done]o

이를 이용하여 문자열의 문자 사이에 구분자를 넣을 수 있으며, 나중에는 리스트에 있는 문자열들을 묶어 하나의 문자열로 만들 수도 있다.

values = ["hello" , "my" , "name", "is a"]
print(''.join(values)) # hellomynameis a

다음과 같이 리스트에 있는 문자열들을 하나로 묶을 수 있다.

2.4 upper, lower

소문자를 대문자로 바꾸는 메서드 upper()과 대문자를 소문자로 바꾸는 메서드 lower()이다. 주의 할 것은 원본 문자열을 바꾸는 것이 아닌 새로운 문자열을 반환한다는 것이다.

value = "Hello My World"
print(value.lower()) # hello my world
print(value.upper()) # HELLO MY WORLD

2.5 lstrip, rstrip, strip

공백지우기 메서드로 lstrip, rstrip, strip가 있다. 이름처럼 lstrip은 왼쪽 공백을 rstrip은 오른족 공백을 strip은 왼쪽, 오른쪽 공백을 지운다.

value =" hello my name is a gyu "
print(value.lstrip()) # hello my name is a gyu 
print(value.rstrip()) #  hello my name is a gyu
print(value.strip()) # hello my name is a gyu

주로 입력을 받고 오른쪽 공백(줄바꿈 문자로 인한)을 지우기 위해 rstrip을 많이 사용한다.

2.6 replace

문자열을 특정 문자열로 바꿀 수 있다. 문자열.replace("원본 문자", "바꾸려는 문자") 순서이다.

value =" hello my name is a gyu "
print(value.replace("hello", "??")) #  ?? my name is a gyu

2.7 split

문자열 나누기로 문자열.split()으로 사용한다. split()안에 아무것도 넣어주지 않으면 공백(스페이스, 탭, 엔더 등)을 기준으로 문자열을 잘라 리스트에 넣어준다. 만약 split(',')로 했다면 ,을 기준으로 문자열을 잘라 리스트에 넣어준다.

value ="hello my name is a gyu "
value1 = "a,b,c,d"
print(value.split()) # ['hello', 'my', 'name', 'is', 'a', 'gyu']
print(value1.split()) # ['a,b,c,d']

이밖에도 정말 많은 문자열 메서드들이 있다. 그 모든 것을 외우는 것은 쉽지 않으며 필요할 때마다 계속해서 배우도록 하자

0개의 댓글