[Python]텍스트 처리

2023. 12. 22. 16:29· 공부/Python
목차
  1. 텍스트 데이터
  2. 텍스트 데이터 종류
  3. 파이썬 텍스트 데이터 관련 라이브러리
  4. 문자열
  5. 문자열 처리 연산
  6. 문자열 인덱싱, 슬라이싱
  7. 문자열 처리 메소드
  8. 문자열 포맷팅
  9. format() 메소드
  10. f-string
  11. split() 메소드
  12. join() 메소드
  13. 대문자와 소문자 변환
  14. 문자열 앞뒤 공백(특정문자) 제거
  15. 문자열 검색
  16. 문자열 카운트, 문자열 대체
  17. 워드 클라우드
  18. 워드 클라우드 : 중지어 제거
  19. 정규 표현식(Regular expression)
  20. 정규(표현)식
  21. re.search() 함수
  22. re.search() 함수 반환값
  23. 메타 문자 : 앵커
  24. 메타 문자
  25. 확장 정규식의 메타 문자
  26. re.findall() 메소드
  27. re.sub() 메소드
  28. re.search 에서 해당 하는 단어만 출력
  29. findall 함수 사용
반응형

텍스트 데이터

텍스트 데이터 종류

  • 구조화된 문서 : HTML, XML, CSV, JSON 파일
  • 구조화되지 않은 문서 : 자연어로 된 텍스트

파이썬 텍스트 데이터 관련 라이브러리

  • 기본 라이브러리에서 제공하는 문자열 처리 함수
  • 문자열 객체(str) 메소드
  • string 모듈 → 문자열 상수 정의
    • string.ascii uppercase, string.ascii_letters, string.digits
  • 외부 모듈
    • wordcloud → 워드 클라우드 생성
    • re → 정규 표현식
    • BeautifulSoup, csv, json, nltk 등

문자열

  • 변경 불가능 자료형 → str
  • 문자열 상수
    • 작은 따옴표나, 따옴표로 묶음
      • ex) ‘test’ == “test”
      • ex) ‘I am not “human”.’
    • 여러줄 문자열 상수는 따옴표 3개로 묶음
      • ex) 여러 줄 문자열 상수
  • 이스케이프 문자
    • 문자열 내부에서 명령어처럼 사용되는 문자
      • \n → 줄 바꿈
      • \t → 탭 간격 띄우기
      • \ → 역슬래시 출력
      • \’, \” ⇒ 따옴표 출력

문자열 처리 연산

  • 문자열 처리 연산자
    • 문자열 합치기 연산 (+) , 문자열 반복 연산 (*)
  • 문자열 처리 함수
    • len(s) → 문자열 길이 반환
      • len(’Hello’) == 5
    • min(s) → 문자열에서 코드값 최소 문자 반환
      • min(’Hello’) == ‘H’
    • max(s) → 문자열에서 코드값 최소 문자 반환
      • max(’Hello’) == ‘o’

문자열 인덱싱, 슬라이싱

  • 문자열도 리스트나 튜플처럼 인덱싱, 슬라이싱 가능
  • 문자열 인덱싱
    • 문자열[i]
      • i >= 0 → 문자열의 i+1 번째 문자 반환
      • i < 0 → 문자열 뒤에서 -i 번째 문자 반환
      문자열[-1] == 문자열[n-1] ← n은 문자열의 크기
  • 문자열 슬라이싱
    • 문자열[s:e] → 문자열[s] 에서 문자열 [e-1] 사이의 부분 문자열 반환
    • 문자열[:e] == 문자열[0:e]
    • 문자열 [s:] == 문자열[s:n] ← n은 문자열의 크기
    • 문자열[:] == 문자열[0:] == 문자열[0:n] == 문자열

문자열 처리 메소드

  • 문자열 객체는 불변자료형
    • 문자열 메소드는 새로운 문자열 반환
  • str 클래스 메소드
    • format() → 문자열 포맷팅 메소드
    • split(), join() → 문자열 나누기, 합치기 메소드
    • upper(), lower() → 대문자/소문자 변환 메소드
    • strip(), lstrip(), rstrip() → 문자열의 위치 반환 메소드
    • find(), index() → 문자열의 위치 반환 메소드
    • count(), replace() → 문자열 카운트, 문자열 대체 메소드

문자열 포맷팅

  1. % 형식 지정 ⇒ “%d, %s” %(123, ‘Hello’)
  2. format 메소드
  3. f-string

format() 메소드

  • 사용형식
    • 형식지정문자열.format(데이터)
      • 형식지정문자열에서 변수 값이 포함될 부분은 중괄호 삽입
      • 중괄호 개수 만큼 format 메소드에 인자 값 전달
  • 형식 지정 문자열의 중괄호 사용 예
    • 중괄호만 사용
      • ‘{ }’.format(’test’)
    • 중괄호와 인덱스(위치인자) 사용
      • ‘{0}{1}’.format(’hello’,’world’)
    • 중괄호와 변수명(키워드인자) 사용
      • ‘{x}{y}’.format(x=’hello’, y=’world’)
    • 중괄호와 인덱스 : 서식 기호 사용
      • ‘{0:3d}’.format(10) == ‘%3d’%10
      • ‘{0:.1f}’.format(3.14) == ‘%.1f’ %3.14
a, b = 2, 3

print('{} * {} = {}'.format(a, b, a*b))        
print('{0} * {1} = {2}'.format(a, b, a*b))        # 위치 인자
print('{a} * {b} = {c}'.format(a=a, b=b, c=a*b))  # 키워드 인자
print('{0} * {1} = {2:3d}'.format(a, b, a*b))     # 서식 기호, 3d
print('{0} / {1} = {2:.1f}'.format(a, b, a/b))    # 서식 기호, .1f

print('{0:<10} | {1:<10}'.format('hello', 'world'))  # 왼쪽 정렬
print('{0:^10} | {1:^10}'.format('hello', 'world'))  # 가운데 정렬 
print('{0:>10} | {1:>10}'.format('hello', 'world'))  # 오른쪽 정렬

2 * 3 = 6 2 * 3 = 6 2 * 3 = 6 2 * 3 = 6 2 / 3 = 0.7 hello | world

hello | world

hello | world

f-string

  • 리눅스 쉘의 매개변수 확장과 유사 → ${변수}
  • 사용형식 → f’{수식:서식}’
    • 수식(변수)의 값으로 바뀜
    • 서식 지정자
      • 문자열(좌측정렬) s, 정수(우측정렬) d, 실수 (우측정렬) f
      • ^10d (정수, 10칸, 좌측정렬)
      • .1f (실수, 소수점 1자리)
  • 파이썬 문자열 포맷팅 방법
    • f-string → f’{x} * {y} = { x*y:2d}’
    • format() 메소드 → ‘{0}{1} = {2:2d}’.format(x, y, xy}
    • % 형식 지정자 → ‘%d * %d = %2d’ %(x,y,x*y)
x, y = 7, 9

print(x, '*', y, '=', x*y)    # 가변인자 활용 문자열 포맷팅
print(f'{x} * {y} = {x*y}')   # f-string 활용 문자열 포맷팅
print('{0} * {1} = {2}'.format(x, y, x*y))  # format() 활용 문자열 포맷팅
print('%d * %d = %d' %(x, y, x*y))          # %형식지정자 활용 문자열 포맷팅

r = 3.14
print(f'{r:.1f}', '{0:.1f}'.format(r), '%.1f' %r)

7 * 9 = 63 7 * 9 = 63 7 * 9 = 63 7 * 9 = 63 3.1 3.1 3.1

split() 메소드

  • 문자열을 구분자(쉼표, 빈칸 등) 기준으로 분리한 문자열 리스트 반환
    • ‘This is a test’.split() → [’This’, ‘is’, ‘a’ , ‘test’]
    • ‘2021.12.25’.split() → [’2021’,’12’,’25’]
  • split 인자에 아무값을 주지않으면 공백으로 분리
# split() 메소드

s1 = 'This is a test'
print(s1.split())     # 빈칸 기준으로 문자열 분리

s2 = '2021.12.25'     
print(s2.split('.'))  # 마침표 기준으로 문자열 분리

s3 = '01:39:27'  
print(s3.split(':'))  # 콜론 기준으로 문자열 분리

Untitled.png

join() 메소드

  • 호출 형식
    • 구분자문자열.join(문자열 리스트)
  • 문자열 리스트를 전달받아, 리스트의 모둔 문자열을 연결한 문자열 반환 → split() 메소드 반대기능
  • 문자열을 연결할 때 구분자 문자열을 중간에 삽입
    • ‘.’.join[’2021’,’12’,’25’] == ‘2021.12.25’
# join() 메소드

print('.'.join(['2021', '12', '25']))     # 문자열 연결

print(' '.join(['This', 'is', 'a', 'test'])) # 문자열 연결

print('-'.join('010.1234.5678'.split('.')))  # 구분자 변경

Untitled.png

대문자와 소문자 변환

  • lower() 메소드
    • 문자열에 포함된 대문자를 소문자로 변환한 문자열 반환
  • upper() 메소드
    • 문자열에 포함된 소문자를 대문자로 변환한 문자열 반환
  • capitalize() 메소드
    • 문자열에서 첫번째 문자만 대문자를 변환한 문자열 반환

문자열 앞뒤 공백(특정문자) 제거

  • strip() 메소드
    • 문자열 앞뒤에 포함된 공백(특정문자)를 제거한 문자열 반환
      • 공백이 아닌 특정문자를 제거하려면, 특정문자를 인자로 전달
  • lstrip() 메소드
    • 문자열 앞(좌측)에 포함된 공백(특정문자)를 제거한 문자열 반환
  • rstrip() 메소드
    • 문자열 뒤(우측)에 포함된 공백(특정문자)를 제거한 문자열 반환

문자열 검색

  • find() 메소드
    • 형식 → 문자열.find(찾을_문자열) 메소드
    • 문자열에서 찾을 문자열을 검색해서 그 위치(인덱스)를 반환
      • 찾는 문자열이 없으면 -1 반환
      • 찾을 문자열이 여러 번 검색되면 첫번째 위치 반환
  • index() 메소드
    • 찾을 문자열이 있으면 그 위치 반환 → find() 메소드와 동일 기능
    • 찾을 문자열이 없으면 오류(ValueError) 발생 → 예외 처리 필요

문자열 카운트, 문자열 대체

  • count() 메소드
    • 문자열에서 찾을 문자열을 빈도 수를 반환
    • 없으면 0 반환
  • replace() 메소드
    • 문자열의 일부분을 다른 문자열로 대체한 문자열 반환
s1 = 'nice to meet you'
print(s1.count('o'), s1.count('e'), s1.count('a'))

s2 = 'Hello World'
print(s2.replace('Hello', 'Hi'))

Untitled.png

replace 메소드 사용 시 원래 s2의 값은 변하지 않는다.

예제:

실습 ) 영문자열을 입력받아, 아래 항목 출력

  1. 대문자 개수
  2. 소문자 개수
  3. 숫자 개수
  4. 특수문자 개수
  5. 공백개수
st = input('영문자열을 입력하여 주세요')
low = 0; upp = 0; num = 0; spe = 0; space = 0
tmp = 0

for i in st: # 대문자
  tmp = ord(i)
  if True == (90 >= tmp >= 65) :  # A~Z
    upp += 1
  else:
    if True == (122 >= tmp >= 97) : # a~z
      low += 1
    else:
      if True ==(57 >= tmp >=48):   # 0~9
        num += 1
      else:
        if tmp == 32: # 공백
          space += 1
          continue
        spe += 1      # 공백, 대문자, 소문자, 숫자가 아닐때 

print('대문자 개수 : ',upp)
print('소문자 개수 : ',low)
print('숫자 개수 : ',num)
print('특수문자 개수 : ',spe)
print('공백 개수 : ', space)    # 공백 개수

워드 클라우드

  • 텍스트 데이터 시각화 기술
    • 각 단어의 크기가 빈도 또는 중요성을 나타냄
  • matplotlib, pandas, wordcloud 모듈 필요
    • 모듈 설치 : pip install wordcloud
  • 워드 클라우드를 생성에 사용할 텍스트 준비
    • wikipedia 모듈 사용
      • 위키백과에서 텍스트 데이터를 가져옴
      • 모듈 설치 : pip install wikipedia

Wikipedia에서 “Deep Learning” 에 대한 정보를 불러와서 워드클라우드를 통해 이미지화

# 위키백과에서 특정 주제로 검색한 텍스트 데이터 가져오기

import wikipedia
from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 위키백과에서 "Deep Learning"을 주제로 설정
wiki = wikipedia.page('Deep Learning')

# 텍스트 데이터 내용 추출
text = wiki.content


# 워드 클라우드 객체 생성
wordcloud = WordCloud(width = 2000, height = 1500).generate(text)

# 워드 클라우드 이미지 크기 설정, 이미지 출력
plt.figure(figsize=(40, 30)) # 워드 클라우드 이미지 크기 설정
plt.imshow(wordcloud) # 워드 클라우드 이미지 출력
plt.show()

Untitled.png

워드 클라우드 : 중지어 제거

  • 중지어(Stop word) : 텍스트 데이터 중 자주 쓰이지만, 특별히 중요한 의미를 갖지 않는 단어
  • 중지어 제거 : STOPWORDS 집합에 추가
from wordcloud import WordCloud, STOPWORDS
import wikipedia
import matplotlib.pyplot as plt

wiki = wikipedia.page('Deep Learning')
text = wiki.content

s_words = STOPWORDS.union( {'retrieved', 'archived', 'will', 'may', 'use', 'original', 'feature', 'using', 'CNN', 'DNN', 'layer'} )
wordcloud = WordCloud(width = 2000, height = 1500, stopwords = s_words).generate(text)

plt.figure(figsize=(40,30))
plt.imshow(wordcloud)
plt.show()
  • 해당(불필요한) 단어를 제외하여 이미지를 만들어낸다

정규 표현식(Regular expression)

  • 텍스트의 패턴을 인식하는 심볼 표기법
  • POSIX 정규 표현식 메타 문자
    • 앵커 메타문자 : ^(캐럿) , $(달러기호)
    • 모든 문자 : . (도트)
    • 대괄호 표현식 : [ ]
  • 확장 정규 표현식 메타 문자
    • 얼터네이션 : |
    • 수량한정자 : ? , * , + , { }

정규(표현)식

  • 파이썬에 정규식 사용을 위해 re 모듈 포함
  • re 모듈에 포함된 정규식 사용 함수
    • re.search( ) 함수
      • 텍스트에서 정규식에 부합되는 부분이 있는지 검사
    • re.findall( ) 함수
      • 텍스트에서 정규식에 부합되는 모든 문자열을 찾아 리스트로 반환
    • re.sub( ) 함수
      • 텍스트에서 정규식에 부합되는 모든 문자열을 찾아 다른 문자열로 대체

re.search() 함수

# 정규표현식 re.search 함수

import re

txt1 = "Hello World, Hi python"
txt2 = "Nice to meet you"

print(re.search('Hi', txt1)) # 일반 문자열도 정규식
print(re.search('To', txt2)) # 대소문자 구분한다.

Untitled.png

  • txt1 에 ‘Hi’라는 문자열이 있어서 객체가 만들어졌다, 그리고 해당 문자가 위치한 위치를 반환
  • txt2에 “To” 는 없어서 객체가 만들어지지 않았다, 해당 함수는 대소문자 구분

re.search() 함수 반환값

  • re.Match 객체 반환
    • start( ) 메소드 → Match 객체 span 시작 인덱스 반환
    • end( ) 메소드 → Match 객체 span 끝 인덱스 반환
    • span( ) 메소드 → Match 객체 span 데이터(튜플) 반환
    • group( ) 메소드 → Match 객체 match 문자열 반환

메타 문자 : 앵커

  • 앵커 메타 문자
    • ^(캐럿) 은 행의 시작 의미
    • ex) ‘^zip’ → zip으로 시작하는 행/문장
    • $(달러)는 행의 끝 의미
    • ex) ‘txt$’ → txt로 끝나는 행/문장
import re

txt1 = "Hello World, Hi python"
txt2 = "Nice to meet you"

print(re.search('^Hi', txt1))  # Hi로 시작하는 문장?
print(re.search('^Nice', txt2)) # Niice로 시작하는 문장?
print(re.search('python$', txt1)) # python으로 끝나는 문장?
print(re.search('to$', txt2))     # to로 끝나는 문장?

Untitled.png

메타 문자

  • 도트 .
    • 공백 문자 제외 어떤 문자로 일치하는 메타문자
    • ex) ‘.grep’ → grep으로 끝나는 5문자 문자열
  • 이스케이프문자 + d , w , s , S
    • \d (숫자 하나) , \w (문자나 숫자 하나)
    • \s (공백문자 하나) , \S (공백 제외 모든 문자 하나)
  • 대괄호 [ ] 표현식
    • 문자 집합을 표현
    • 대괄호 표현식에서 특수문자
      • ^(캐럿) : 부정 의미
      • 예) ‘[^ef]grep’ → e나 f를 제외한 문자로 시작하는 grep
    • -(대시) : 두 문자 사이의 범위 의미
    • 대괄호 표현식에서 나머지 문자는 모두 일반 문자로 간주
import re

print(re.search('H..L' , 'HTML5'))          # 도트 . 문자 사용 H로 시작하고 L로 끝나는 문자 
print(re.search('CSS\d', 'CSS3'))           # \d == [ 0~9 ] CSS + 숫자하나가 있는 문자
print(re.search('[hH]ello', 'hello'))       # 대괄호 표현식 'h' or 'H' + ello 인 문자 
print(re.search('\w\w[1-9]', 'ID9'))        # \w == [0-9a-zA-Z] + [0-9a-zA-Z] + 1~9 인 문자
print(re.search('[A-F][A-F]\s\d', "AB 7"))  # \s == 공백문자 A~F + A~F + 공백 + 숫자 인 문자
print(re.search('[^ABCD].[1-9]', 'E72'))    # 대괄호 표현식 부정 표현 ABCD 를 제외한 1~9 인 문자

Untitled.png

확장 정규식의 메타 문자

  • 얼터네이션 |
    • 여러 표현식 중 하나라도 일치하면 패턴 일치로 간주
    • ex) ‘AAA|BBB’ → 비교 문자열이 AAA이거나 BBB이면 일치
  • 수량한정자 : ?, * , + , { }
    • ? 한정자
      • 앞 항목이 없거나 한번만 나타나는 경우 → ? 앞 항목은 선택적
      • ex) ‘+?[1-9]’ → 1에서 9, 혹은 +1에서 +9
      • 한정자
        • 앞 항목이 없거나 여러 번 나타나는 경우
      • 한정자
        • 앞 항목이 한번 이상 나타나는 경우
    • { } 한정자
      • 앞 항목이 지정된 횟수 만큼 나타나는 경우
      • ex) {n} → 앞 항목이 n번 나타남
# 확장 정규식의 메타 문자

import re

print(re.search('hello|Hello', 'Hello'))        # Alternation | (OR 연산, A 이거나 B 이거나)
print(re.search('\+?\d\d', '10'))               # ? 한정자 \+는 (+)가 한번만 있거나 없어도 찾자라는 뜻, \d\d 는 0-9+0-9(숫자 두자리)를 의미
print(re.search('-[1-9][0-9]*', '-10'))         # * 한정자 앞 항목이 없을수도 있고 여러번 있을때도 찾아줘
print(re.search('\+[1-9]\d+', '+39'))           # + 한정자 (+)1~9,1~9

# ex)‘\+?[1-9]’-> 1에서 9, 혹은 +1에서 +9

# { } 한정자
print(re.search('0\d{2}-[1-9]\d{2}-\d{4}', '053-550-5518'))

# {n, m} 한정자
print(re.search('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', '127.0.0.1'))
  • 실습
    • 주민등록번호를 인식하는 정규표현식 구현
# 주민번호 인식 정규표현식

import re

print(re.search('\d{6}-[1234]\d{6}', '970301-2532321'))
print(re.search('\d{6}-[1234]\d{6}', '523301-5532321'))
  • 실습
    • 텍스트 파일을 읽어서 소괄호 숫자로 시작하는 모든 행 출
    import re
    
    f = open('test1.txt')
    
    for line in f :
      line = line.rstrip()
      if re.search('^\([0-9]+\)', line):
        print(line)
    (숫자 1자리) 인 행 모두 출력한다.

re.findall() 메소드

  • 호출 형식 → findall(정규식, 텍스트)
    • 반환 : 문자열 리스트
    • 텍스트에서 정규식에 부합하는 모든 문자열 목록 → 리스트 형식으로 반환
# re.findall() 메소드

import re

# 멀티라인 텍스트
text = """101 COM PythonProgramming
102 MAT LinearAlgebra
103 ENG ComputerEnglish"""

s = re.findall('\d+', text)    # 1개 이상의 숫자 문자열을 리스트로 반환
print(s)

Untitled.png

re.sub() 메소드

  • 호출 형식 → sub(정규식, 대체문자열, 텍스트)
    • 반환 : 변경된 문자열
    • 텍스트에서 정규식에 부합하는 문자열을 대체문자열로 변경
# re.sub() 메소드

import re

s1 = 'I like dog'
print(re.sub('dog', 'cat', s1))

s2 = 'number = 1 2 3 4'
print(re.sub('[0-9]+', '*', s2))

Untitled.png

re.search 에서 해당 하는 단어만 출력

  • search 함수를 사용하면 해당 오브젝트 형태로 출력이 된다.

Untitled.png

  • match에 해당 하는 값만 출력해서 보고 싶다면 re.search(”조건식, Value”).group()
  • .group() 함수를 사용하면 Match 되는 값만 볼 수 있다.

findall 함수 사용

  • re.findall(”(\w+)”) : 문자열 , 숫자를 하나씩 추출 [특수문자는 미포함]
  • re.findall(”(^w+)”) : 문자열, 숫자를 제외한 문자 추출
반응형
  1. 텍스트 데이터
  2. 텍스트 데이터 종류
  3. 파이썬 텍스트 데이터 관련 라이브러리
  4. 문자열
  5. 문자열 처리 연산
  6. 문자열 인덱싱, 슬라이싱
  7. 문자열 처리 메소드
  8. 문자열 포맷팅
  9. format() 메소드
  10. f-string
  11. split() 메소드
  12. join() 메소드
  13. 대문자와 소문자 변환
  14. 문자열 앞뒤 공백(특정문자) 제거
  15. 문자열 검색
  16. 문자열 카운트, 문자열 대체
  17. 워드 클라우드
  18. 워드 클라우드 : 중지어 제거
  19. 정규 표현식(Regular expression)
  20. 정규(표현)식
  21. re.search() 함수
  22. re.search() 함수 반환값
  23. 메타 문자 : 앵커
  24. 메타 문자
  25. 확장 정규식의 메타 문자
  26. re.findall() 메소드
  27. re.sub() 메소드
  28. re.search 에서 해당 하는 단어만 출력
  29. findall 함수 사용
'공부/Python' 카테고리의 다른 글
  • [Python]객체지향프로그래밍
  • [Python]넘파이 배열
  • [Python]맷플롯립
  • [Python]판다스
Future0_
Future0_
rm -rf /
Future0_
Luna Developer Blog
Future0_
전체
오늘
어제
  • 분류 전체보기 (112)
    • 프로그래밍 (4)
      • 알고리즘 (4)
    • 보안 (14)
      • Dreamhack (4)
      • Hackthebox (1)
      • Webhacking (9)
    • 프로젝트 (4)
    • 공부 (80)
      • Database (2)
      • Python (11)
      • System (4)
      • Java (13)
      • JSP (13)
      • Spring (11)
      • Kotlin (16)
      • 자료구조 (10)
      • 기계학습 (0)
    • Docker (4)
    • Github (2)
    • Tip (1)
    • 잡담 (2)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • 상속
  • spring
  • 프로그래밍
  • Java
  • cs
  • 디버깅키해시
  • Kotlin
  • 자료구조
  • 알고리즘
  • Database
  • 키 해시
  • 자바빈즈
  • React
  • ViewModel
  • docker
  • shared preference
  • Android Studio
  • Python
  • SpringBoot
  • webhacking
  • native app
  • Computer science
  • 1.9.22
  • 컴퓨터
  • 코틀린기본문법
  • api 통신
  • android studio 삭제
  • jsp
  • dreamhack
  • 보안

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
Future0_
[Python]텍스트 처리
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.