정규 표현식은
문자열에서 특정한 패턴을 검색하거나 대체하는 데 사용되는
모든 언어에 공통
인 강력한 도구
프로그래밍에서 정규 표현식을 이해하고 사용할 수 있다면,
복잡한 문자열 처리 작업을 간단하게 해결할 수 있음
^
, $
,
, +
, ?
, |
, ()
, []
, {}
, .
)a
, b
, 1
, 2
)[a-z]
, \d
, \w
)
, +
, ?
, {n}
, {n,}
, {n,m}
)문자 클래스는 정규 표현식에서
특정한 세트의 문자 중 하나와 일치시키기 위해 사용되는 패턴
문자 클래스를 사용하면, 개별 문자를 나열하는 방식으로
여러 문자 중 하나와 일치하는 조건을 정의할 수 있음
문자 클래스는 대괄호 []
안에 문자를 나열하여 생성
[abc]
"a", "b", 또는 "c" 중 하나와 일치
예를 들어, "a"는 이 패턴과 일치
[^abc]
"a", "b", "c"를 제외한 모든 문자와 일치
즉, ^
는 문자 클래스 안에서 사용될 때 부정을 의미
[a-z]
"a"부터 "z"까지의 소문자 알파벳 중 하나와 일치
[A-Z]
"A"부터 "Z"까지의 대문자 알파벳 중 하나와 일치
[0-9]
"0"부터 "9"까지의 숫자 중 하나와 일치
[a-zA-Z]
모든 소문자 및 대문자 알파벳 중 하나와 일치
[a-zA-Z0-9]
모든 알파벳 문자 및 숫자 중 하나와 일치
문자 클래스 내에서 대부분의 메타 문자는
그 특별한 의미를 잃고 문자 그대로 해석됨
예를 들어, [.]
는 문자 "."과 정확히 일치
-
(하이픈)은 문자 범위를 지정할 때 사용됨
(예: [a-z]
)
^
(캐럿)은 문자 클래스의 시작 부분에 위치할 때만
부정 문자 클래스를 정의하는 데 사용됨
(예: [^a-z]
는 소문자 알파벳을 제외한 모든 문자와 일치)
.
(점)
임의의 단일 문자와 일치(단, 줄바꿈 문자 \n
은 제외)
예를 들어, a.b
는 acb
, aab
, a3b
와 일치하지만,
a\nb
와는 일치하지 않음
^
(캐럿)
문자열의 시작과 일치
예를 들어, ^Hello
는 "Hello"로 시작하는 문자열과 일치
$
(달러)
문자열의 끝과 일치
예를 들어, end$
는 "end"로 끝나는 문자열과 일치
*
(별표)
바로 앞의 문자(또는 패턴)가 0번 이상 반복되는 경우와 일치
예를 들어, ab*
는 "a", "ab", "abb", "abbb" 등과 일치
+
(플러스)
바로 앞의 문자(또는 패턴)가 1번 이상 반복되는 경우와 일치
예를 들어, ab+
는 "ab", "abb", "abbb" 등과 일치하지만,
"a"와는 일치하지 않음
?
(물음표)
바로 앞의 문자(또는 패턴)가 0번 또는 1번 나타나는 경우와 일치
예를 들어, ab?
는 "a", "ab"와 일치하지만, "abb"와는 일치하지 않음
{n}
(중괄호)
바로 앞의 문자(또는 패턴)가 정확히 n번 반복되는 경우와 일치
예를 들어, a{3}
는 "aaa"와 일치
{n,}
바로 앞의 문자(또는 패턴)가 n번 이상 반복되는 경우와 일치
{n,m}
바로 앞의 문자(또는 패턴)가 최소 n번, 최대 m번 반복되는 경우와 일치
[...]
(대괄호)
대괄호 안에 포함된 어떤 한 문자와 일치
예를 들어, [abc]
는 "a", "b", "c" 중 하나와 일치
[^...]
대괄호 안에 포함되지 않은 어떤 한 문자와 일치
예를 들어, [^abc]
는 "a", "b", "c"를 제외한 어떤 한 문자와 일치
|
(파이프)
OR 조건을 나타내며, |
기호로 구분된 두 패턴 중 하나와 일치
예를 들어, a|b
는 "a" 또는 "b"와 일치
\
(역슬래시)
메타 문자를 이스케이프하거나 특별한 시퀀스를 나타냄
예를 들어, \.
는 문자 그대로의 점과 일치하고, \d
는 숫자와 일치
기능별 실 사용 사례
"이메일 주소는 example@example.com입니다."
import re
def find_email(text):
# 이메일 주소를 찾기 위한 정규 표현식 패턴
email_pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
# re.findall을 사용하여 모든 이메일 주소를 찾음
emails = re.findall(email_pattern, text)
return emails
#예시 문자열
text = "이메일 주소는 example@example.com입니다."
result = find_email(text)
print(result) # 출력: ['example@example.com']
"<div>Hello <b>World</b></div>"
import re
def remove_html_tags(html_string):
# 정규 표현식 패턴: <...> 형태의 모든 태그를 매칭
clean_text = re.sub(r'<.*?>', '', html_string)
return clean_text.strip() # 앞뒤 공백 제거
'''
.*?의 경우는
"어떤 문자든지 0개 이상"을 찾되,
가능한 짧은 문자열을 매칭하려고 함
.*의 경우는 "어떤 문자든지 0개 이상"을 찾으며,
가능한 많은 문자를 매칭하려고 함
예를 들어, 문자열 <div>Hello <b>World</b></div>에서
.*를 사용하면 <div>Hello <b>World</b>와 같이 최대한 긴 문자열을 매칭
.*?를 사용하면 <div>와 <b> 각각을 짧게 매칭
'''
# 예시
html_string = "<div>Hello <b>World</b></div>"
result = remove_html_tags(html_string)
print(result) # 출력: Hello World
010-1234-5678
→ 010-1234-****
import re
def mask_phone_number(phone_number):
# 정규 표현식 패턴
pattern = r'(\d{3}-\d{4})-\d{4}'
# 일반 문자열: '\\d{3}-\\d{4}-\\d{4}'
# raw 문자열: r'\d{3}-\d{4}-\d{4}'
# 마스킹 처리
masked_number = re.sub(pattern, r'\1-****', phone_number) # \1은 첫번째 그룹을 의미(그룹은 괄호로 감싸서 나타냄)
# re.sub는 특정 패턴에 맞는 문자열을 찾아
# 다른 문자열로 대체하는 기능을 수행
return masked_number
# 예시
phone_number = "010-1234-5678"
masked = mask_phone_number(phone_number)
print(masked) # 출력: 010-1234-****
정규 표현식은 문자열을 처리하는 데 있어 매우 강력한 도구임
정규 표현식을 숙련되게 사용하게 되면,
복잡한 문자열 처리 작업을 효과적으로 해결할 수 있게 됨
re.compile
은 주어진 정규 표현식을 컴파일하여
재사용 가능한 패턴 객체를 생성하는 기능을 수행
재사용 가능한 패턴 객체
는 정규 표현식을 컴파일하여 생성된 객체로,
이를 사용하면 동일한 정규 표현식을 여러 번 적용할 때
매번 문자열을 컴파일할 필요 없이 성능을 향상시킬 수 있음
즉, 한 번 컴파일된 패턴 객체를 사용하여
다양한 문자열에 대해 검색이나 대체 작업을 수행할 수 있음