Python: 문자열 (String)

dev-swd·2020년 10월 25일
0

python

목록 보기
3/23
post-thumbnail

Python: String

문자열 변수 만드는 법

"", '' 를 사용하여 감싸준다.

str1 = "python"
str2 = """python is not difficult"""

# 작은 따음표를 사용하는 것도 가능 '', ''' ''' 

문자열 연산

더하기(+) 연산으로 문자열을 붙일 수 있다.

str1 = "123"
str2 = "45"
print(str1 + str2) # 12345

문자열 슬라이싱(Slicing)

인덱스 값을 이용해서 문자열을 자를 수 있다.

jumin = "990120-1234567"

print(jumin[:]) # 전부 다 출력
#990120-1234567

gender = jumin[7]
print(gender) # 7번째 요소 출력 (0부터 시작하여 7번째)
#1

year = jumin[0:2]
print(year) # 0부터 2직전까지 (2번째는 포함 안됨)
#99

month = jumin[2:4]
print(month) # 2번째 부터 4번째 직전까지
#01

day = jumin[4:6]
print(day) # 4번쨰 부터 6번째 직전까지
#20

juminPre = jumin[:6]
print(juminPre) # 6번째직전까지
#990120

juminPost = jumin[7:]
print(juminPost) # 7번째 부터 끝까지
#1234567

juminPost2 = jumin[-7:]
print(juminPost2) # 뒤에서 7번째 까지
#1234567

juminPost2 = jumin[7:-1] # 인덱스 7부터 -1까지 가져옴
print(juminPost2)
#1234567

# 인덱스 증가폭 사용하기
a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
a[2:8:3]    # 인덱스 2부터 3씩 증가시키면서 인덱스 7까지 가져옴
[20, 50]

a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
a[:7:2]    # 리스트의 처음부터 인덱스를 2씩 증가시키면서 인덱스 6까지 가져옴
# [0, 20, 40, 60]

a[::2]     # 리스트 전체에서 인덱스 0부터 2씩 증가시키면서 요소를 가져옴
[0, 20, 40, 60, 80]

a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
a[5:1:-1]
[50, 40, 30, 20]

range(0, 10)
list(r[:7:2])
# [0, 2, 4, 6]


# 예제출처: youtube채널 나도코딩 - 파이썬 기초, 코딩도장 파이썬

슬라이스 객체

다음과 같이 시퀀스 객체의 또는 getitem 메서드에 slice 객체를 넣어주면 지정된 범위만큼 잘라내서 새 객체를 만든다.

range(10)[slice(4, 7, 2)]
range(4, 7, 2)

range(10).__getitem__(slice(4, 7, 2))
range(4, 7, 2)


# slice 객체를 하나만 만든 뒤 여러 시퀀스 객체에 사용하는 방법도 가능합니다.

a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
s = slice(4, 7)    # 인덱스 4부터 6까지 자르는 slice 객체 생성
a[s]
[40, 50, 60]

r = range(10)
r[s]
range(4, 7)

hello = 'Hello, world!'
hello[s]
'o, '

# 슬라이스에 사용하여 요소 할당하기
a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
a[2:5] = ['a']    # 인덱스 2부터 4까지에 값 1개를 할당하여 요소의 개수가 줄어듦

[0, 10, 'a', 50, 60, 70, 80, 90]

# 튜플, range, 문자열은 슬라이스 범위를 지정하더라도 요소를 할당할 수 없습니다.


출처: 코딩도장 파이썬 (https://dojang.io/mod/page/view.php?id=2208)

문자열 포멧

% 이용하기

  • %s - 문자열 (문자열 포멧에서는 숫자를 받을 수 있다)
  • %d - 정수 (퍼센트를 표현하고 싶을 때는 %d% 와 같이 쓴다)
  • %f - 실수
  • %c - 문자 1개 (character)
str1= "파이썬 공부중 %d일째" %3 #정수
print(str1)

str2 = "%s 공부중 3일째" %"파이썬" #문자열
print(str2)

str3 = "파이썬의 아이콘 모양은 %c 모양이다" %"뱀" #캐릭터
print(str3)

# 복수의 파라미터 값을 출력하고 싶을 때
str1= "파이썬 공부중 %d일째이며, %s 부분을 공부하고 있습니다." %(3, "문자열")
print(str1)
#파이썬 공부중 3일째이며, 문자열 부분을 공부하고 있습니다.

format 함수 사용하기

tr1 = "{0}을 공부하고 있으며, {1}일차 입니다." .format("파이썬", 4)
print(str1) # 파이썬을 공부하고 있으며, 4일차 입니다.

str2 = "{lang}을 공부하고 있으며, {days}일차 입니다." .format(lang="Python", days=4)
print(str2) # 파이썬을 공부하고 있으며, 4일차 입니다.


# Python 3.6+ 에서는 "" 앞에 f 를 사용하여 간단하게 formatting 할 수 있다.
lang = "Python"
days = 4

str3 = f"{lang}을 공부하고 있으며, {days}일차 입니다."

print(str3) # 파이썬을 공부하고 있으며, 4일차 입니다.

문자열 이스케이프(escape)

이스케이프 문자설명
\n줄바꿈
\문자열 내에서 \ 로 취급
\'문자열 내에서 ' 로 취급
\"문자열 내에서 " 로 취급
\r커서를 맨 앞으로 이동 (공백문자 포함한 문자열을 가장 앞으로 가져와서 대체)
\b백스페이스. 한 글자를 삭제하는데, 가장 끝의 글자는 삭제하지 않음
\t

문자열 응용

  • replace("바꿀 문자열", "새 문자열")
    반환값 없음. (void)
str.replace("바꿀 문자열", "새문자열")

  • translate()
    반환값 trans 객체
trans = str.maketrans("바꿀 문자", "새문자")
str.translate(trans)

  • split()
    반환값 list
'apple pear grape pineapple orange'.split()
['apple', 'pear', 'grape', 'pineapple', 'orange']

  • join(iterable)
    구분자 문자열과 문자열 리스트 요소를 연결하여 문자열로 만든다.
' '.join(['apple', 'pear', 'grape', 'pineapple', 'orange'])
'apple pear grape pineapple orange'

  • upper() - 대문자로

  • lower() - 소문자로

  • lstrip() - 왼쪽 공백 제거
', python.'.lstrip(',.') - 왼쪽의 특정 문자 삭제

  • rstrip() - 오른쪽 공백 제거
', python.'.rstrip(',.') - 오른쪽의 특정 문자 삭제

  • strip() - 양 옆 공백 제거
', python.'.strip(',.') - 양 옆 특정 문자 삭제

  • 구두점 간단하게 삭제
import string
', python.'.strip(string.punctuation) - 문자열 양쪽의 모든 구두점을 삭제
' python'

# string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

  • 양 옆의 구두점 + 공백까지 삭제
', python.'.strip(string.punctuation + ' ')
'python'

# 체이닝
', python.'.strip(string.punctuation).strip()
'python'

  • ljust(width) 문자열 왼쪽 정렬 <> rjust(width)
'python'.ljust(10)

'python    '

  • center(width) 문자열 가운데 정렬
'python'.center(10)

'  python  '

  • zfill(길이)
    지정된 길이에 맞춰서 문자열의 왼쪽에 0을 채운다. 문자열의 길이가 지정된 길이보다 작다면 채우지 않는다.
"35".zfill(4)
"0035"

  • find(찾을 문자열) 문자열 위치 찾기
    -문자열에서 특정 문자열을 찾아서 인덱스를 반환. 없으면 -1
    -find 는 왼쪽에서부터 문자열을 찾는데, 같은 문자열이 여러 개일 경우 처음 찾은 문자열의 인덱스를 반환
"apple pineapple".find("pl)
2

"apple pineapple".find("xy)
-1

  • index(찾을 문자열)
    왼쪽에서 특정 문자열을 찾아 인덱스를 반환. 단, 없으면 에러 발생시킴.
    마찬가지로 같은 문자열이 여러 개일 경우 처음 찾은 문자열의 인덱스를 반환.

  • rindex(찾을 문자열)
    오른쪽에서 특정 문자열을 찾아 인덱스를 반환. 단, 없으면 에러 발생시킴.
    없으면 에러 발생. 처음 찾은 문자열의 인덱스를 반환.

  • count(찾을 문자열)
    현재 문자열에서 문자열이 몇 번 나오는지 알아냄.

서식지정

제목제목
%s문자열
%d숫자
%f숫자 (소숫점) 기본적으로 소수점 이하 6자리까지
%.자릿수f숫자 자릿수 지정
%10s%뒤에 숫자를 붙이면, 문자열을 길이로 만든 뒤, 오른쪽 정렬하고 남는 공간을 공백으로
r""문자열 앞에 r 또는 R을 붙이면 raw 문자열이 된다. 이스케이프 시퀀스를 그대로 저장할 때 사용된다.
'%10s' % 'python'
'    python'

'%10d' % 150
'       150'

'%10d' % 15000
'     15000'

'%-10s' % 'python'
'python    '

문제1. 다음 문장에서 the 가 몇 번 포함되는지

line = """
the grown-
ups' response, this time, was to advise me to lay aside my drawings of
boa constrictors, whether from the inside or the outside, and devote
myself instead to geography, history, arithmetic, and grammar.
That is why, at the, age of six, I gave up what might have been a
magnificent career as a painter. I had been disheartened by the failure of
my Drawing Number One and my Drawing Number Two. Grown-ups never understand
anything by themselves, and it is tiresome for children to be always and
forever explaining things to the."""

line_list = line.split(" ")
c = 0
for l in line_list:
  if l.strip(",.") == "the":
    c = c + 1

print(c)

문제2. 다음 숫자열을 크기가 큰 순서대로 오른쪽 정렬하고, 남는 공간은 공백으로 채워서 출력

num_list = "51900;83000;158000;367500;250000;59200;128500;1304000"
test = list(map(int, num_list.split(";")))

test.sort(reverse=True)

for i in test:
  print(format(i, ">9,"))

# 출력 결과
1,304,000
  367,500
  250,000
  158,000
  128,500
   83,000
   59,200
   51,900

그 외 출력 연습 문제

  • sep="", end=""
# print("python", "Java", "JavaScript", sep=" vs ", end="?")

# 출력 결과
python vs Java vs JavaScript?

  • 색갈 출력
import sys
print("python", "java", file=sys.stdout)
print("python", "java", file=sys.stderr)

  • money format
# 3자리마다 , 를 찍어서 출력 (money format)
print("{0:,}" .format(9718239871))
print("{0:+,}" .format(9718239871))
print("{0:+,}" .format(-9718239871))
print("{0:^<+30,}" .format(12394294))

  • 빈자리는 빈공간으로 두고, 오른쪽 정렬을 하되, 총 10자리의 공간을 확보하기
print("{0: >10}" .format(500))

# 실행 결과
       500

  • # 양수일 때는 +로 표시, 음수일 때는 -로 표시
print("{0: <+10}" .format(500))
print("{0: <+10}" .format(-500))

  • 왼쪽 정렬하고, 빈칸을 _로 채워라
print("{0:_<+10}" .format(100))
print("{0:_<+10}" .format(-100))

  • 소수점 출력
# 소숫점 출력
# print("{0:f}" .format(5/3))
# print("{0:.2f}" .format(5/3))

출처

profile
개발을 취미로 할 수 있는 그 때 까지

0개의 댓글