1. 정규표현식
정규 표현식의 의미
정규 표현식(Regular Expressions, regex)은 문자열에서 특정 패턴을 찾거나 조작하기 위해 사용되는 문자 시퀀스입니다. 정규 표현식은 복잡한 문자열 검색과 치환 작업을 간단하고 효율적으로 수행할 수 있게 해줍니다.
정규 표현식의 활용방법
- 텍스트 검색: 특정 단어나 패턴을 포함하는 텍스트를 찾는 데 사용됩니다.
- 데이터 유효성 검사: 이메일 주소, 전화번호, 우편번호 등의 형식을 검증하는 데 사용됩니다.
- 텍스트 치환: 특정 패턴을 다른 문자열로 바꾸는 데 사용됩니다.
- 데이터 추출: 로그 파일, HTML 문서 등에서 필요한 정보를 추출하는 데 사용됩니다.
- 데이터 정제: 데이터셋에서 불필요한 공백, 특수 문자 등을 제거하는 데 사용됩니다.
정규 표현식을 사용하는 이유
- 효율성: 복잡한 문자열 검색과 치환 작업을 간단한 패턴으로 표현할 수 있어 코드가 간결해집니다.
- 유연성: 다양한 패턴을 정의할 수 있어 여러 종류의 문자열 작업에 적용할 수 있습니다.
- 강력함: 정규 표현식은 매우 강력한 도구로, 복잡한 텍스트 조작 작업을 효율적으로 수행할 수 있습니다.
2. 기본 패턴
문자 클래스
\d
: 숫자 (0-9)import re text = "There are 3 apples." matches = re.findall(r'\d', text) print(matches) # ['3']
\D
: 숫자가 아닌 문자import re text = "There are 3 apples." matches = re.findall(r'\D', text) print(matches) # ['T', 'h', 'e', 'r', 'e', ' ', 'a', 'r', 'e', ' ', ' ', 'a', 'p', 'p', 'l', 'e', 's', '.']
\w
: 단어 문자 (알파벳, 숫자, 밑줄)import re text = "Hello_world123" matches = re.findall(r'\w', text) print(matches) # ['H', 'e', 'l', 'l', 'o', '_', 'w', 'o', 'r', 'l', 'd', '1', '2', '3']
\W
: 단어 문자가 아닌 문자import re text = "Hello, world!" matches = re.findall(r'\W', text) print(matches) # [',', ' ', '!']
\s
: 공백 문자 (스페이스, 탭, 줄바꿈)import re text = "Hello world\n" matches = re.findall(r'\s', text) print(matches) # [' ', '\n']
\S
: 공백 문자가 아닌 문자import re text = "Hello world\n" matches = re.findall(r'\S', text) print(matches) # ['H', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']
반복
*
: 0회 이상 반복import re text = "abbbb ac" matches = re.findall(r'ab*', text) print(matches) # ['abbbb', 'a']
+
: 1회 이상 반복import re text = "abbbb ac" matches = re.findall(r'ab+', text) print(matches) # ['abbbb']
?
: 0회 또는 1회import re text = "ab ac" matches = re.findall(r'ab?', text) print(matches) # ['ab', 'a']
{n}
: 정확히 n회 반복import re text = "123 4567 89" matches = re.findall(r'\d{3}', text) print(matches) # ['123', '456']
{n,}
: n회 이상 반복import re text = "123 4567 89" matches = re.findall(r'\d{2,}', text) print(matches) # ['123', '4567', '89']
{n,m}
: n회 이상 m회 이하 반복import re text = "123 4567 89" matches = re.findall(r'\d{2,3}', text) print(matches) # ['123', '45', '67', '89']
기타
.
: 임의의 한 문자 (줄바꿈 제외)import re text = "a1 b2 c3" matches = re.findall(r'a.', text) print(matches) # ['a1']
^
: 문자열의 시작import re text = "start middle end" matches = re.findall(r'^start', text) print(matches) # ['start']
$
: 문자열의 끝import re text = "start middle end" matches = re.findall(r'end$', text) print(matches) # ['end']
[]
: 문자 집합 (예:[a-z]
는 소문자 알파벳)import re text = "abc 123" matches = re.findall(r'[a-c]', text) print(matches) # ['a', 'b', 'c']
|
: OR 연산자 (예:a|b
는 'a' 또는 'b')import re text = "abc def" matches = re.findall(r'a|d', text) print(matches) # ['a', 'd']
()
: 그룹화 (예:(abc)
는 'abc'를 하나의 그룹으로 취급)import re text = "abc def" matches = re.findall(r'(abc)', text) print(matches) # ['abc']
3. 예시코드 및 활용코드
1. 숫자 찾기 (\d+)
import re
text = "There are 123 apples and 456 oranges."
matches = re.findall(r'\d+', text)
print(matches) # ['123', '456']
- \d+:
- \d는 숫자를 의미합니다.
- +는 하나 이상의 연속된 숫자를 찾습니다.
- 따라서, 이 패턴은 문자열에서 하나 이상의 연속된 숫자를 모두 찾습니다.
2. 이메일 주소 찾기
import re
text = "Contact us at support@example.com or sales@example.org."
pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
matches = re.findall(pattern, text)
print(matches) # ['support@example.com', 'sales@example.org']
- [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}:
- [a-zA-Z0-9._%+-]+: 알파벳 대소문자, 숫자, 점(.), 밑줄(_), 퍼센트(%), 더하기(+), 빼기(-) 중 하나 이상의 문자.
- @: ‘@’ 문자.
- [a-zA-Z0-9.-]+: 알파벳 대소문자, 숫자, 점(.), 빼기(-) 중 하나 이상의 문자.
- \.: 점(.) 문자.
- [a-zA-Z]{2,}: 알파벳 대소문자 중 2개 이상의 문자.
- 이 패턴은 이메일 주소 형식을 찾습니다.
3. URL 찾기
import re
text = "Visit our website at https://www.example.com or http://example.org."
pattern = r'https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
matches = re.findall(pattern, text)
print(matches) # ['https://www.example.com', 'http://example.org']
- https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}:
- https?: ‘http’ 또는 ‘https’ (s는 선택적).
- ://: ‘://’ 문자.
- [a-zA-Z0-9.-]+: 알파벳 대소문자, 숫자, 점(.), 빼기(-) 중 하나 이상의 문자.
- \.: 점(.) 문자.
- [a-zA-Z]{2,}: 알파벳 대소문자 중 2개 이상의 문자.
- 이 패턴은 URL 형식을 찾습니다.
4. 전화번호 찾기
import re
text = "Call me at 123-456-7890 or 987-654-3210."
pattern = r'\d{3}-\d{3}-\d{4}'
matches = re.findall(pattern, text)
print(matches) # ['123-456-7890', '987-654-3210']
- \d{3}-\d{3}-\d{4}:
- \d{3}: 3개의 숫자.
- -: ‘-’ 문자.
- \d{3}: 3개의 숫자.
- -: ‘-’ 문자.
- \d{4}: 4개의 숫자.
- 이 패턴은 전화번호 형식을 찾습니다.
5. 단어 찾기 (\b\w+\b)
import re
text = "This is a simple sentence."
matches = re.findall(r'\b\w+\b', text)
print(matches) # ['This', 'is', 'a', 'simple', 'sentence']
- \b\w+\b:
- \b: 단어 경계.
- \w+: 하나 이상의 단어 문자 (알파벳, 숫자, 밑줄).
- \b: 단어 경계.
- 이 패턴은 단어를 찾습니다.
6. 특정 문자로 시작하는 문자열 찾기 (^)
import re
text = "Hello world\nPython is fun"
matches = re.findall(r'^Hello', text, re.MULTILINE)
print(matches) # ['Hello']
- ^Hello:
- ^: 문자열의 시작.
- Hello: ‘Hello’ 문자.
- 이 패턴은 문자열의 시작 부분에서 'Hello’를 찾습니다.
7. 특정 문자로 끝나는 문자열 찾기 ($)
import re
text = "Hello world\nPython is fun"
matches = re.findall(r'fun$', text, re.MULTILINE)
print(matches) # ['fun']
- fun$:
- fun: ‘fun’ 문자.
- $: 문자열의 끝.
- 이 패턴은 문자열의 끝 부분에서 'fun’을 찾습니다.
8. 공백 문자 찾기 (\s+)
import re
text = "This is a test."
matches = re.findall(r'\s+', text)
print(matches) # [' ', ' ', ' ']
- \s+:
- \s: 공백 문자 (스페이스, 탭, 줄바꿈).
- +: 하나 이상의 연속된 공백 문자.
- 이 패턴은 하나 이상의 연속된 공백 문자를 찾습니다.
9. 대소문자 구분 없이 찾기 (re.IGNORECASE)
import re
text = "Python is fun. python is powerful."
matches = re.findall(r'python', text, re.IGNORECASE)
print(matches) # ['Python', 'python']
- python:
- python: ‘python’ 문자.
- re.IGNORECASE: 대소문자 구분 없이 검색.
- 이 패턴은 대소문자 구분 없이 'python’을 찾습니다.
10. 그룹화 (())
import re
text = "My phone number is 123-456-7890."
pattern = r'(\d{3})-(\d{3})-(\d{4})'
matches = re.findall(pattern, text)
print(matches) # [('123', '456', '7890')]
- (\d{3})-(\d{3})-(\d{4}):
- (\d{3}): 3개의 숫자를 그룹화.
- -: ‘-’ 문자.
- (\d{3}): 3개의 숫자를 그룹화.
- -: ‘-’ 문자.
- (\d{4}): 4개의 숫자를 그룹화.
- 이 패턴은 전화번호 형식을 찾고, 각 부분을 그룹화하여 반환합니다.
'데이터 분석' 카테고리의 다른 글
[데이터 크롤링] Selenium에서 iframe 다루기: switch_to.frame()을 활용한 효율적인 접근 방법 (0) | 2024.10.16 |
---|---|
streamlit 기본 기능 연습 (3) | 2024.10.06 |
Flask서버로 이미지 전송 및 결과 받기 (1) | 2024.10.03 |
클러스터링(군집화) 타당성 평가 (0) | 2024.09.14 |
wine 데이터셋을 활용한 혼동행렬 시각화 (0) | 2024.09.14 |