본문 바로가기
IT/파이썬 기초 완전 정복

파이썬 문자열 처리 기초 (14)

by 지식 발전소 2024. 4. 20.
728x90
반응형

 

문자열이란?

안녕하세요. 오늘은 파이썬 프로그래밍의 기본이 되는 문자열(String)에 대해 자세히 알아보겠습니다. 문자열은 프로그래밍에서 가장 많이 다루는 자료형 중 하나입니다. 왜 문자열을 잘 다룰 수 있어야 할까요?

 

 

 

문자열은 프로그램이 사용자와 소통하는 핵심 수단입니다. 사용자가 입력한 텍스트 데이터를 문자열로 받아 처리하고, 프로그램의 출력 역시 문자열 형태로 이루어집니다. 따라서 문자열을 제대로 다룰 수 있어야 프로그램의 기능을 구현할 수 있습니다.

 

문자열이란 무엇일까요? 문자열은 문자(Character)의 열거 혹은 나열입니다. 문자열은 작은 따옴표('...') 또는 큰 따옴표("...")로 묶어서 표현합니다.

문자열1 = "Hello, World!"
문자열2 = 'Python은 파이썬이야'

위 예시에서 문자열1은 H, e, l, l, o, ,, , W, o, r, l, d, ! 등 13개의 문자들로 이루어져 있습니다. 이처럼 문자열은 문자의 나열이라고 볼 수 있습니다.

 

문자열은 프로그래밍에서 가장 기본적인 자료형이면서도 다양한 활용도를 가지고 있습니다. 텍스트 데이터를 처리하는 모든 분야에서 문자열을 다룰 수 있어야 합니다.

 

따라서 문자열 처리 기초를 확실히 익히면 더 나아가 파이썬 프로그래밍의 기본기를 다지는데 큰 도움이 될 것입니다.

 

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

문자열은 시퀀스 자료형의 일종으로, 각 문자에 인덱스 번호가 할당되어 있습니다. 인덱스는 0부터 시작합니다. 또한 음수 인덱스를 이용하면 문자열의 뒤에서부터 인덱싱할 수 있습니다.

문자열 = "Hello, World!"
print(문자열[0])  # 'H'
print(문자열[6])  # 'W'
print(문자열[-1])  # '!'

파이썬에서 인덱스를 이용하는 가장 일반적인 방법은 슬라이싱(Slicing)입니다. 슬라이싱은 문자열의 일부분을 잘라내는 것을 말합니다.

문자열 = "Hello, World!"
print(문자열[0:5])   # 'Hello'  
print(문자열[:5])    # 'Hello'
print(문자열[7:])    # 'World!' 
print(문자열[:])     # 'Hello, World!' (전체 문자열)
print(문자열[::2])   # 'Hlo,Wrd' (2칸 간격으로)
print(문자열[::-1])  # '!dlroW ,olleH' (역순)

시작인덱스:끝인덱스:간격의 형태로 슬라이싱합니다. 간격을 생략하면 1로 간주되며, 음수값을 지정하면 역순으로 슬라이싱됩니다.

왜 문자열 인덱싱과 슬라이싱이 중요할까요? 텍스트 데이터를 조작하는 대부분의 경우에서 특정 부분만 잘라내거나 재구성해야 하는 상황이 발생합니다. 이때 문자열 인덱싱과 슬라이싱을 활용하면 매우 쉽게 원하는 부분을 추출할 수 있습니다. 웹 스크래핑, 데이터 전처리, 검색어 처리 등에서 유용하게 사용됩니다.

문자열 메소드

파이썬의 str 클래스는 매우 유용한 메소드들을 제공하고 있습니다. 이를 잘 활용하면 문자열 처리를 간편하게 할 수 있습니다. 주요 메소드들을 알아보겠습니다.

문자 개수 세기

  • len(문자열): 문자열의 길이(문자 개수)를 반환합니다.
  • 문자열.count(부분문자열): 문자열에서 부분문자열이 몇 번 나오는지 갯수를 반환합니다.
text = "Python is fun. Python is easy."
print(len(text))  # 27
print(text.count("Python"))  # 2

문자열 탐색

  • 문자열.find(부분문자열): 문자열에서 부분문자열이 최초로 나타나는 위치의 인덱스를 반환합니다. 없으면 -1을 반환합니다.
  • 문자열.index(부분문자열): find()와 동일하지만, 부분문자열이 없으면 ValueError 예외를 발생시킵니다.
  • 문자열.startswith(부분문자열): 문자열이 부분문자열로 시작하면 True를 반환합니다.
  • 문자열.endswith(부분문자열): 문자열이 부분문자열로 끝나면 True를 반환합니다.
text = "Hello, Python!"
print(text.find("Python"))    # 7
print(text.index("Python"))   # 7
print(text.startswith("He"))  # True
print(text.endswith("on!"))   # True

문자열 치환

  • 문자열.replace(old, new): 문자열에서 old 문자열을 new 문자열로 모두 바꾼 새 문자열을 반환합니다.
  • 문자열.strip([chars]): 문자열 양끝의 특정 문자들을 제거한 새 문자열을 반환합니다. chars를 지정하지 않으면 공백 문자를 제거합니다.
text = "   Hello, World!   "
print(text.replace("World", "Python"))  # "   Hello, Python!   "
print(text.strip())                     # "Hello, World!"

문자열 분할

  • 문자열.split(sep): 문자열을 sep 구분자로 분할하여 리스트로 반환합니다. sep을 지정하지 않으면 공백 문자를 구분자로 사용합니다.
  • 문자열.partition(sep): 문자열을 sep 구분자로 분할하여 최초로 나오는 부분만 분리합니다. 결과는 앞 부분, 구분자, 뒷부분을 원소로 갖는 튜플입니다.
text = "Python,is,fun"
print(text.split(","))       # ['Python', 'is', 'fun']  
print(text.partition(","))   # ('Python', ',', 'is,fun')

기타

  • 문자열.upper(): 대문자로 변환된 새 문자열을 반환합니다.
  • 문자열.lower(): 소문자로 변환된 새 문자열을 반환합니다.
  • 문자열.capitalize(): 문자열의 첫 문자를 대문자로 변환한 새 문자열을 반환합니다.
  • 문자열.join(iterable): 시퀀스 자료형의 원소들을 문자열로 연결하여 반환합니다. 문자열이 구분자가 됩니다.
text = "hello, world!"
print(text.upper())         # 'HELLO, WORLD!'
print(",".join(["1", "2", "3"]))   # '1,2,3'

이외에도 isalpha(), isdigit(), isspace() 등의 메소드가 있습니다.

파이썬 문자열 메소드 익히기! 문자열 메소드들은 쓰임새가 매우 다양합니다. 어떤 메소드가 있는지 정확히 알고, 이를 적재적소에 활용할 수 있어야 효율적인 문자열 처리가 가능합니다. 문자열을 다루는 대부분의 상황에서 해결의 실마리를 제공해줄 것입니다.

문자열 포매팅

프로그래밍에서 문자열을 출력할 때 단순한 문자열 병합 외에 특정 형식으로 문자열을 구성해야 하는 경우가 많습니다. 이때 문자열 포매팅(Formatting)을 이용하면 편리하게 원하는 모양으로 문자열을 만들 수 있습니다.

포매팅 방식 1: % 연산자

name = "Alice"
age = 25

print("안녕하세요. %s님, 나이가 %d세 이군요" % (name, age))
# 출력: "안녕하세요. Alice님, 나이가 25세이군요"

% 연산자를 이용하여 문자열을 포맷팅합니다. 문자열 뒤에 %와 데이터를 괄호로 감싸 적으면 됩니다. 포맷 지시자를 이용하여 자료형에 맞추어 출력할 수 있습니다.

  • %s: 문자열(String)
  • %d: 정수(Integer)
  • %f: 실수(Float)

서식 지정도 가능합니다.

pi = 3.14159265359

print("원주율은 %.2f입니다" % pi)    # 원주율은 3.14입니다
print("%10.4f" % pi)                  #'    3.1416' (전체 10자리, 소수점 4자리)

포매팅 방식 2: format() 메소드

Python 2.6 이후 버전에서는 format() 메소드를 이용한 포매팅 방식이 권장됩니다.

name = "Alice"
age = 25
height = 165.5

print("안녕하세요. {} 님, 나이가 {}세이고, 키는 {}cm입니다".format(name, age, height))
# 출력: "안녕하세요. Alice 님, 나이가 25세이고, 키는 165.5cm입니다"

위치 인덱스 지정도 가능합니다.

print("이름은 {0}, 키는 {2}cm, 나이는 {1}세입니다".format(name, age, height))
# 출력: "이름은 Alice, 키는 165.5cm, 나이는 25세입니다" 

이름으로 키워드를 지정하여 포매팅할 수도 있습니다.

print("이름은 {name}, 키는 {height}cm, 나이는 {age}세입니다".format(name="Alice", age=25, height=165.5))
# 출력: "이름은 Alice, 키는 165.5cm, 나이는 25세입니다"

정렬과 공백 채우기, 접두사/접미사 붙이기 등의 기능도 제공됩니다.

print("{:<10}".format("Hi"))   # 'Hi        '(왼쪽 정렬, 10칸 공백 채움)
print("{:>10}".format("Hi"))   # '        Hi'(오른쪽 정렬)
print("{:^10}".format("Hi"))   # '    Hi    '(가운데 정렬) 
print("{:+d}".format(123))     # '+123'(양수에 +기호 붙임)
print("{:0>5}".format(123))    # '00123'(숫자 5자리 맞추기, 0으로 채움)

포매팅 방식 3: f-string (Python 3.6 이상)

Python 3.6 버전부터는 리터럴 문자열 보간(Literal String Interpolation) 기능을 사용할 수 있습니다. 이를 f-string(Formatted String Literals)이라고 부릅니다.

name = "Alice"
age = 25 

print(f"안녕하세요. {name}님, 나이가 {age}세군요")
# 출력: "안녕하세요. Alice님, 나이가 25세군요"

f-string은 결과 문자열 안에 {변수}와 같이 값을 직접 삽입할 수 있습니다. 표현식을 사용하는 것도 가능합니다.

a = 10
b = 20
print(f"{a} + {b} = {a + b}")       # 10 + 20 = 30

**f-string은 포매팅 기능이 매우 강력합니다.** 딕셔너리의 키로 접근하거나 객체의 속성에 접근할 수도 있습니다.

```python
person = {"name": "Alice", "age": 25}
print(f"{person['name']}의 나이는 {person['age']}세입니다.")
# 출력: Alice의 나이는 25세입니다.

class Person:
    def __init__(self, name, age):
        self.name = name 
        self.age = age

p = Person("Alice", 25)
print(f"{p.name}의 나이는 {p.age}세입니다.")
# 출력: Alice의 나이는 25세입니다.

또한 함수 호출, 조건 표현식 등도 사용할 수 있어 매우 유연합니다.

import math

print(f"5의 제곱근은 {math.sqrt(5):.2f}입니다.")
# 출력: 5의 제곱근은 2.24입니다.

point = (-3, 5)
print(f"점 {point}는 {'원점'if point == (0, 0) else '원점이 아닙니다'}입니다.")
# 출력: 점 (-3, 5)는 원점이 아닙니다입니다.

f-string은 가독성과 유지보수성이 뛰어납니다. 문자열과 값을 구분하여 작성하므로 좀 더 명확하고 직관적인 코드를 작성할 수 있습니다. 따라서 파이썬 3.6 이상 버전에서는 f-string을 적극 활용하는 것이 좋습니다.

문자열 메소드 활용 예제

지금까지 배운 내용을 바탕으로 문자열 메소드를 활용한 예제를 몇 가지 살펴보겠습니다.

예제 1) 문장 반복 확인하기

주어진 문장에서 특정 단어가 몇 번 반복되는지 확인하는 예제입니다.

text = """
안녕하세요. 파이썬 교육 플랫폼 '점프 투 파이썬' 문자열 강의입니다.
문자열은 따옴표로 묶어야 합니다.
파이썬은 다양한 문자열 처리 기능을 제공합니다.
유용한 문자열 메소드를 익혀보세요.
파이썬 문자열은 파이썬만의 독특한 기능이 있습니다.
"""

word = "파이썬"
count = text.lower().count(word.lower())
print(f"'{word}'는(은) {count}번 나왔습니다.")

위 코드는 문자열의 count() 메소드와 lower() 메소드를 사용하여 대소문자 구분 없이 단어의 출현 횟수를 계산합니다. 출력 결과는 '파이썬'는(은) 3번 나왔습니다.입니다.

예제 2) 문자열 정렬하기

문자열의 정렬 방식을 이용하여 출력 모양을 예쁘게 만드는 예제입니다.

names = ["Alice", "Emily", "Christopher", "Michael", "Jessica"]
name_lengths = [len(name) for name in names]
max_length = max(name_lengths)

print("이름 목록")
print("-" * (max_length + 4))
for name in names:
    print(f"| {name:^{max_length}} |")
print("-" * (max_length + 4))

이 코드는 max() 함수와 리스트 내포를 사용하여 이름 중 가장 긴 길이를 구합니다. 그리고 {변수:^길이} 형태의 포맷팅을 적용하여 가운데 정렬된 출력을 만듭니다. 실행 결과는 다음과 같습니다.

이름 목록
--------------
| Christopher |
|    Emily    |
|   Michael   |
|   Jessica   |
|    Alice    |
--------------

예제 3) 텍스트 전처리하기

웹 스크래핑이나 자연어 처리에서는 문자열 데이터를 전처리하는 작업이 필수적입니다. 다음은 그 예시입니다.

import re

text = """
안녕하세요. 반갑습니다.
내 이메일은 hello@example.com입니다.
휴대폰 번호는 010-1234-5678입니다.
"""

# 이메일 추출
emails = re.findall(r'[\w\.-]+@[\w\.-]+', text)
for email in emails:
    print(f"이메일: {email}")

# 전화번호 추출
phones = re.findall(r'\d{2,3}-\d{3,4}-\d{4}', text)
for phone in phones: 
    print(f"전화번호: {phone}")

이 예제에서는 정규 표현식을 활용하여 문자열에서 이메일 주소와 전화번호를 추출합니다. 이메일과 전화번호에 대한 패턴을 정규식으로 정의하고, re.findall() 함수를 사용하여 매칭되는 부분 문자열을 찾습니다. 출력 결과는 다음과 같습니다.

이메일: hello@example.com
전화번호: 010-1234-5678

 

이처럼 문자열 메소드와 정규 표현식을 적절히 활용하면 문자열 데이터를 효과적으로 처리할 수 있습니다.

참고 자료

  1. 박응용 (2017), 점프 투 파이썬, 초판 2쇄, 이지스퍼블리싱. [5장 파이썬 데이터 구조]
  2. Luciano Ramalho (2017), Fluent Python, 박완규 옮김, 인사이트. [5장 첫 번째 클래스: 문자열]
  3. Python 3 Documentation, Text Sequence Type - str
  4. Allen B. Downey (2021), 파이썬을 여행하는 개체지향 관광, 박 영환 옮김, 제이펍. [ISBN: 979-11-90665-52-9]

 

 

 

한 고대 문서 이야기

여기 한 고대 문서가 있습니다. 이 문서는 B.C. 1,500년 부터 A.D 100년까지 약 1,600 여 년 동안 기록되었습니다. 이 문서의 저자는 약 40 명입니다. 이 문서의 고대 사본은 25,000 개가 넘으나, 사본간 오

gospel79.tistory.com

 

유튜브 프리미엄 월 1만원 할인받고 월 4000원에 이용하는 방법

올해 5월부터 월 8000원 정도이던 유튜브 프리미엄 요금이 15000원 정도로 인상됩니다. 각종 OTT 서비스, ChatGPT 같은 서비스들이 늘어나다보니 이런 거 몇 개만 이용하더라도 월 이용요금이 5만원을

stock79.tistory.com

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

728x90
반응형

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글