2. Python 기초

2.5. 문자열

2.5.1. 문자열 생성

  • 문자열(string)
    • 문자(character)들이 나열된 시퀀스 자료형(sequence data type)
    • 한 번 생성된 이후에는 수정할 수 없는 불변형(immutable) 객체
    • 큰 따옴표 또는 작은 따옴표로 감싸서 문자열을 생성함


  • 이스케이프 문자(escape character)
    • \ 기호와 함께 조합해서 사용하는 특수한 문자
    • \" : 큰 따옴표
    • \' : 작은 따옴표
    • \n : 줄 바꿈(new line)
    • \t : 탭(tab)
# 문자열 생성
print("안녕하세요")
print('Hello')
안녕하세요
Hello
# 문자열 내부에 따옴표 넣기
print('"안녕하세요"라고 말했습니다.')
print("'날씨가 좋다'라고 생각했습니다.")
"안녕하세요"라고 말했습니다.
'날씨가 좋다'라고 생각했습니다.
# 이스케이프 문자 사용1
print("\"안녕하세요\"라고 말했습니다.")
print('\'날씨가 좋다\'라고 생각했습니다.')
"안녕하세요"라고 말했습니다.
'날씨가 좋다'라고 생각했습니다.
# 이스케이프 문자 사용2
print("Hello\nWorld")
Hello
World
# 이스케이프 문자 사용3
print("Hello\tWorld")
Hello   World
# 여러 줄 문자열 만들기 : 세 번 반복한 따옴표로 감쌈
print("""동해물과 백두산이 마르고 닳도록
하느님이 보우하사 우리나라 만세
무궁화 삼천리 화려강산
대한사람 대한으로 길이 보전하세""")
동해물과 백두산이 마르고 닳도록
하느님이 보우하사 우리나라 만세
무궁화 삼천리 화려강산
대한사람 대한으로 길이 보전하세


2.5.2. 문자열 연산

  • 문자열 연결 연산자 + : 두 문자열을 연결해서 새로운 문자열 생성
  • 문자열 반복 연산자 * : 문자열을 숫자만큼 반복하여 새로운 문자열 생성 - (예) 문자열*숫자
# 문자열 연결
print("Hello " + "Wolrld")
Hello Wolrld
# 문자열 연결 연산자는 문자열과 숫자를 연결할 수 없음
#score = 99
#print("성적은" + score + "입니다.")
# 문자열 연결 연산자로 문자열과 숫자를 연결하려면 숫자를 문자열로 변환해야 함
score = 99
print("성적은" + str(score) + "입니다.")
성적은99입니다.
# 문자열 반복
print("Hello " * 3)
Hello Hello Hello 


2.5.3. 문자열 인덱싱과 슬라이싱

  • 문자열의 각 문자에 접근할 때 문자 위치인 인덱스(index)를 사용함
    • Python은 숫자를 0부터 세는 제로 인덱스(zero index) 유형을 사용함


  • 인덱싱(indexing)
    • [index]를 사용하여 문자열의 특정 위치에 있는 항목(문자)에 접근하는 것
    • 리버스 인덱싱(reverse indexing) : 음수 인덱스를 사용하면 마지막 값부터 -1씩 감소하여 역순으로 접근할 수 있음


  • 슬라이싱(slicing)
    • [(start index):(stop index)]를 이용하여 문자열의 일부 문자를 추출하는 것
    • 끝 인덱스는 포함하지 않으니 주의해야 함
    • 시작 인덱스를 생략하면 첫 번째 글자부터 추출하며, 끝 인덱스를 생략하면 가장 마지막 글자까지 추출함

# 문자열 인덱싱1
s = "안녕하세요"
print(s[0])
# 문자열 인덱싱2
s = "안녕하세요"
print(s[-1])
# 문자열 슬라이싱1
s = "안녕하세요"
print(s[0:2])
안녕
# 문자열 슬라이싱2
s = "안녕하세요"
print(s[:2])
print(s[2:])
print(s[::2])
안녕
하세요
안하요
# 문자열은 불변형 객체이므로 인덱스를 이용한 수정은 불가능함
#s = "안녕하세요"
#s[2:5] = "하십니까"
#print(s)
# 문자열을 변경하려면 새로운 문자열을 만들어야 함
s = "안녕하세요"
s = s[:2] + "하십니까"
print(s)
안녕하십니까
# 문자열 거꾸로 출력하기
my_str = "Hello Python!"
print(my_str[::-1])
!nohtyP olleH


2.5.4. 문자열 함수

2.5.4.1. 문자열 길이

  • len() 함수 : 문자열에 들어있는 문자의 개수(문자열의 길이) 반환
# 문자열 길이
s = "안녕하세요"
print(len(s))
5


2.5.4.2. 대소문자 변환

함수 설명
lower() 문자열의 알파벳을 모두 소문자로 변환
upper() 문자열의 알파벳을 모두 대문자로 변환
# 대소문자 변환 : 원본은 변하지 않음
s = "Hello Python!"
print(s.lower())
print(s.upper())
print(s)
hello python!
HELLO PYTHON!
Hello Python!


2.5.4.3. 문자열 찾기

함수 설명
find() - 문자열에서 특정 문자열을 왼쪽에서부터 찾아서 인덱스를 반환
- 찾는 문자열이 없으면 -1을 반환
rfind() - 문자열에서 특정 문자열을 오른쪽에서부터 찾아서 인덱스를 반환
- 찾는 문자열이 없으면 -1을 반환
count() - 문자열에서 특정 문자열의 개수를 반환
in 연산자 - 문자열 내부에 특정 문자열이 있다면 True, 없다면 False를 반환
# 문자열 찾기
s = "Hello! Python is Python"
print(s.find("Python"))
print(s.rfind("Python"))
print(s.count("Python"))
print("Hello" in s)
print("Hi" in s)
7
17
2
True
False


2.5.4.4. 공백 제거 및 문자열 변경

함수 설명
strip() 문자열 양 옆의 공백이나 특정 문자를 제거
rstrip() 문자열 오른쪽의 공백이나 특정 문자를 제거
lstrip() 문자열 왼쪽의 공백이나 특정 문자를 제거
replace() 특정 문자열을 다른 문자열로 변경
# 공백 제거
s = "  Hello Python!  "
print(s)
print(s.strip())
  Hello Python!  
Hello Python!
# 특정 문자 제거
s = "##100kg, ##200kg"
print(s.rstrip("kg"))
print(s.lstrip("#"))
##100kg, ##200
100kg, ##200kg
# 문자열 변경
s = "Hello Python!"
print(s.replace("Hello", "Hi"))
Hi Python!


2.5.4.5. 문자열 분리 및 결합

함수 설명
split() - 특정문자를 기준으로 문자열을 분리하고 리스트로 반환
join() - 여러 문자열을 모아서 하나의 문자열로 만듬
- 문자열을 구분할 구분자를 지정해야 함
# 문자열 분리
s = "Hello Python!"
s.split(" ")
['Hello', 'Python!']
# 문자열 결합
lst = ["one", "two", "three"]
print(", ".join(lst))
print(" - ".join(lst))
one, two, three
one - two - three


2.5.4.6. 문자열 구성 파악

함수 설명
isdigit() 문자열이 숫자로만 구성되었는지 확인
isalpha() 문자열이 알파벳으로만 구성되었는지 확인
isalnum() 문자열이 알파벳과 숫자로만 구성되었는지 확인
islower() 문자열이 소문자로만 구성되었는지 확인
isupper() 문자열이 대문자로만 구성되었는지 확인
isspace() 문자열이 공백으로만 구성되었는지 확인
# 문자열 구성 파악
print("1234".isdigit())
print("Python".isalpha())
print("pass123".isalnum())
print("hello".islower())
print("HELLO".isupper())
print("     ".isspace())
True
True
True
True
True
True


2.5.4.7. 형 변환

함수 설명
str() 수를 문자열로 변환
int() 정수 형식의 문자열이나 실수를 정수로 변환
float() 실수 형식의 문자열이나 정수를 실수로 변환
# 형 변환1
a = 1234
#print(a + "kg")
print(str(a) + "kg")
1234kg
# 형 변환2
print(int("1234"))
print(float("3.14"))
1234
3.14


2.5.4.8. format() 함수

“{자료형}”.format(인수)


  • {}를 포함한 문자열 뒤에 .을 찍고 format() 함수를 사용하여 문자열이 출력되는 형식을 지정할 수 있음
    • 앞쪽에 있는 문자열 안의 {} 기호가 format() 함수의 매개변수로 차례로 대치되면서 숫자가 문자열이 됨
    • {} 개수와 format() 함수의 매개변수 개수는 반드시 같아야 함
  • f-문자열이 format() 함수보다 간단하고 직관적이므로, 대부분 f-문자열을 사용함


  • f-문자열보다 format() 함수를 사용하는 것이 더 좋은 경우
    • 문자열 내용이 너무 많을 때 - 어떤 데이터를 출력하는지 모아서 볼 수 있어 더 유용함
    • 데이터를 리스트에 담아서 사용할 때
# format() 함수1
print("{}".format(10))
print("{} {}".format(10, 20))
print("{} {} {} {} {}".format(10, 20, 30, 40, 50))
10
10 20
10 20 30 40 50
# format() 함수2
name = "홍길동"
age = 20
print(f"이름은 {name}이고, 나이는 {age}입니다.")
print("이름은 {}이고, 나이는 {}입니다.".format(name, age))
이름은 홍길동이고, 나이는 20입니다.
이름은 홍길동이고, 나이는 20입니다.
# format() 함수3
a = 4
b = 3.14159265
print("20{:02d}".format(a))                # a 값을 두자리로 출력하되 앞의 빈곳은 0으로 채움
print("{:.3f}".format(b))                  # b 값을 소수점 이하 세자리로 반올림하여 출력
2004
3.142
# 데이터를 리스트에 담아서 사용할 때는 format() 함수를 사용하는 것이 더 좋음
data = ["별", 2, "M", "Yes"]

# f-문자열 사용
print(f"이름: {data[0]}, 나이: {data[1]}, 성별: {data[2]}, 중성화 여부: {data[3]}")

# format() 함수 사용
# 전개 연산자 *를 사용하여 리스트 내용을 전개함
print("이름: {}, 나이: {}, 성별: {}, 중성화 여부: {}".format(*data))
이름: 별, 나이: 2, 성별: M, 중성화 여부: Yes
이름: 별, 나이: 2, 성별: M, 중성화 여부: Yes