4. String Search and Manipulations - 4.1 Search Pattern in Text(문자열 검색 및 조작) (텍스트 패턴 검색)

2024. 2. 14. 22:47CS - Roadmap.sh/4. String Search and Manipulations

4 String Search and Manipulations - 4.1 Search Pattern in Text

String Search and Manipulations (문자열 검색 및 조작)

String search and manipulation is a very important topic in computer science. It is used in many different applications, such as searching or replacing a specific pattern, word or character in a string.

 

문자열 검색과 조작은 컴퓨터 과학에서 매우 중요한 주제입니다. 문자열에서 특정 패턴, 단어 또는 문자를 검색하거나 바꾸는 등 다양한 애플리케이션에서 사용됩니다.

 

Search Pattern in Text (텍스트 패턴 검색)

Searching pattern in text is a very common task in computer science. It is used in many applications like spell checkers, text editors, and many more.

텍스트에서 패턴을 검색하는 것은 컴퓨터 과학에서 매우 일반적인 작업입니다. 맞춤법 검사기, 텍스트 편집기 등 많은 애플리케이션에서 사용됩니다.

 

 

파이썬에서 문자열 조작은 다양한 메서드들이 있습니다. 또한 문자열 탐색과 조작에서 가장 대표적인 '텍스트에서 패턴 검색'도 파이썬에서 구현할수 있습니다.

 

find(), index(), count() 등 간단한 예시를 보며 알아봅시다.

 

text = "파이썬은 매우 강력한 프로그래밍 언어입니다. 파이썬은 가독성이 좋고, 유연성이 뛰어납니다."

# find()
print(text.find("파이썬"))  # 출력: 0
print(text.find("자바"))  # 출력: -1

# index()
print(text.index("파이썬"))  # 출력: 0
try:
    print(text.index("자바"))  # ValueError 발생
except ValueError:
    print("찾는 문자열이 없습니다.")

# count()
print(text.count("파이썬"))  # 출력: 2

 

 

좀더 고급 방법에는 정규 표현식(Regular Expression)이 있습니다.

파이썬에서는 re 모듈을 통해 정규 표현식을 사용할 수 있습니다.

 

정규 표현식은 좀 더 복잡한 문자열 패턴을 검색하거나 조작하는데 사용됩니다. 예로 이메일 주소, 전화번호, 지역 주소 등등 형식을 검증하거나, 특정 패턴을 가진 문자열을 찾는데 사용됩니다.

 

주로

re.search(pattern,string), re.match(), re.findall, re.sub 등이 있습니다.

 

import re

text = "저의 이메일은 example@gmail.com이고, 전화번호는 010-1234-5678입니다."

# 이메일 패턴
email_pattern = r"[a-zA-Z0-9._+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+"
email = re.search(email_pattern, text)
print(email.group())  # 출력: example@gmail.com

# 전화번호 패턴
phone_pattern = r'\d{3}-\d{4}-\d{4}'
phone = re.search(phone_pattern, text)
print(phone.group())  # 출력: 010-1234-5678

# 이메일 주소 모두 찾기
all_emails = re.findall(email_pattern, text)
print(all_emails)  # 출력: ['example@gmail.com']

# 이메일 주소 치환하기
new_text = re.sub(email_pattern, "new_email@example.com", text)
print(new_text)  # 출력: 저의 이메일은 new_email@example.com이고, 전화번호는 010-1234-5678입니다.

 

 

 

 

사족 단어경계 \b 에 대해서


\b는 단어 경계를 양쪽에서 확인합니다. 즉, "cat"이라는 단어 앞뒤에 공백 문자나 다른 문자가 있어야 합니다.
\B는 단어 경계가 아닌 곳을 확인합니다.

email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'

도중에 이것으로 검색하니 email 이 안나오고 오류가 떠서 헷갈렸다.

\b로 단어경계를 구별하면 '저의 이메일은 example@gmail.com이고, ~~~' 에서 구별할수 있다고 생각했다.

 

\b


이유는 \b가 단어 경계를 나타내는 메타 문자이기 때문입니다. \b는 문자열의 시작 또는 끝, 혹은 공백, 숫자, 기호와 같은 문자 경계에서만 일치합니다.

예시:
"example@gmail.com"은 \b 없이도 일치합니다.
" example@gmail.com "은 \b 없이도 일치합니다. (앞뒤 공백은 \b 없이도 일치)
"thisisnotanemail@gmail.com"은 \b 없이도 일치합니다. (앞뒤 공백은 \b 없이도 일치)
"thisisnotemail@gmail.com"은 \b 없이도 일치합니다. (숫자와 문자 사이는 \b 없이도 일치)
"thisisnotanemail@gmail.com."은 \b 없이도 일치합니다. (문자와 기호 사이는 \b 없이도 일치)
하지만, 다음과 같은 경우에는 \b가 있어야만 일치합니다.

"thisisnotanemail@gmail.com" (단어 경계가 없어 일치하지 않음)
"thisisnotemail@gmail.com" (단어 경계가 없어 일치하지 않음)
따라서, \b를 없애면 텍스트에서 이메일 주소를 더 정확하게 찾을 수 있습니다.


좀 더 다른 예시)


정규 표현식에서 \b는 단어 경계를 나타내는 메타 문자입니다. 단어 경계는 다음과 같은 경우 발생합니다.

문자와 공백 문자 사이
숫자와 문자 사이
문자와 기호 사이
공백 문자와 기호 사이


예시:
\bcat\b는 "cat"이라는 단어만 일치시키고 "cats"나 "catdog"는 일치시키지 않습니다.
\b123\b는 "123"이라는 숫자만 일치시키고 "1234"나 "123abc"는 일치시키지 않습니다.
\bhello\b는 "hello"라는 단어만 일치시키고 "hello!"나 "hello?"는 일치시키지 않습니다.


참고:
\b는 단어 경계를 양쪽에서 확인합니다. 즉, "cat"이라는 단어 앞뒤에 공백 문자나 다른 문자가 있어야 합니다.

\B는 단어 경계가 아닌 곳을 확인합니다.


예시:
\Bcat\B는 "cats"나 "catdog"와 같은 문자열에서 "cat"을 일치시킵니다.
\B123\B는 "1234"나 "123abc"와 같은 문자열에서 "123"을 일치시킵니다.
\Bhello\B는 "hello!"나 "hello?"와 같은 문자열에서 "hello"를 일치시킵니다.


사용 예시:
특정 단어가 문장의 시작 또는 끝에 있는지 확인하는 경우
특정 숫자가 다른 숫자 또는 문자와 혼동되지 않도록 하는 경우
특정 단어가 특정 기호와 함께 사용되는지 확인하는 경우

email_pattern = r"[a-zA-Z0-9._+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+"

 

이렇게 단어경계를 구분을 빼니 잘 찾아집니다.

\b가 좀더 엄격한 정규표현식임을 기억하자!

728x90