[νμ΄μ¬] μ κ·ννμ νμ© λ°©λ²
μλ³Έ κ²μκΈ: https://velog.io/@euisuk-chung/νμ΄μ¬-μ κ·ννμ-νμ©-λ°©λ²
μ κ·ννμ(Regular Expression, RegEx)
μ λ¬Έμμ΄μ μ²λ¦¬νκ³ ν¨ν΄μ κ²μνκ±°λ λ³νν λ λ§€μ° μ μ©ν λꡬμ
λλ€. λ°μ΄ν° κ³Όνκ³Ό μΉ μ€ν¬λν, ν
μ€νΈ μ²λ¦¬ λ± λ€μν μμ
μμ λ¬Έμμ΄μ λ€λ£° λ μ κ·ννμμ νμμ μΌλ‘ μ¬μ©λ©λλ€.
μ΄λ² ν¬μ€νΈμμλ νμ΄μ¬μμ re
λͺ¨λμ μ¬μ©ν΄ μ κ·ννμμ μ΄λ»κ² νμ©ν μ μλμ§μ λν΄ μμΈν μμλ³΄κ² μ΅λλ€.
-
μ κ·ννμμ΄λ?
μ κ·ννμμ νΉμ ν¨ν΄μ κ°μ§ λ¬Έμμ΄μ μ°ΎκΈ° μν κ²μ ν¨ν΄μ λλ€. μλ₯Ό λ€μ΄, μ΄λ©μΌ μ£Όμλ₯Ό μ°Ύκ±°λ μ νλ²νΈμ κ°μ νΉμ νμμ λ°μ΄ν°λ₯Ό μΆμΆν λ μ¬μ©λ μ μμ΅λλ€.
μ κ·ννμμ κΈ°λ³Έμ μΈ κ°λ
μ ν¨ν΄μ μ μνκ³ , κ·Έ ν¨ν΄μ κΈ°λ°μΌλ‘ λ¬Έμμ΄μ κ²μνκ±°λ λ³ννλ κ²μ
λλ€. νμ΄μ¬μμλ μ΄λ₯Ό μν΄ re
λͺ¨λμ μ¬μ©ν©λλ€.
-
μ κ·ννμμμ μ£Όμ κ°λ λ° ν¨ν΄
μ κ·ννμ(Regular Expression, RegEx)μ λ¬Έμλ€λ‘ μ΄λ£¨μ΄μ§ ν¨ν΄μ μ μνκ³ , μ΄ ν¨ν΄μ μ¬μ©ν΄ νΉμ λ¬Έμμ΄μ μ°Ύκ±°λ λ°κΎΈλ λꡬμ λλ€. μ½κ² λ§ν΄, μ κ·ννμμ λ¬Έμμ΄μμ μνλ λΆλΆμ μλμΌλ‘ μ°Ύμλ΄λ βλ§€μ° λλνβ λ°©λ²μ΄λΌκ³ ν μ μμ΅λλ€.
μλμμ μ κ·ννμμμ μμ£Ό μ°μ΄λ μ£Όμ κ°λ λ€μ νλμ© μμλ³΄κ² μ΅λλ€.
-
.
(μ ): μμμ ν λ¬Έμμ μΌμΉν©λλ€.- μ:
a.c
λ βabcβ, βaxcβ, βa7cβμ μΌμΉνμ§λ§ βacβ, βabbcβμλ μΌμΉνμ§ μμ΅λλ€.
- μ:
-
\d
(μ«μ): μ«μ(0~9)μ μΌμΉν©λλ€.- μ:
\d\d
λ β12β, β89β, β45βμ κ°μ λ μ리 μ«μμ μΌμΉν©λλ€.
- μ:
-
\D
(μ«μκ° μλ): μ«μκ° μλ λ¬Έμμ μΌμΉν©λλ€.- μ:
\D
λ βaβ, βZβ, β!βμ μΌμΉνμ§λ§ β1βκ³Όλ μΌμΉνμ§ μμ΅λλ€.
- μ:
-
\w
(λ¬Έμμ μ«μ): μνλ²³ λ¬Έμ, μ«μ, λ°μ€(_
)κ³Ό μΌμΉν©λλ€.- μ:
\w\w\w
λ βabcβ, β123β, βA2_βμ κ°μ μΈ κ°μ λ¬Έμ λλ μ«μμ μΌμΉν©λλ€.
- μ:
-
\W
(λ¬Έμμ μ«μκ° μλ): μνλ²³ λ¬Έμ, μ«μ, λ°μ€(_
)μ΄ μλ λ¬Έμμ μΌμΉν©λλ€.- μ:
\W
λ β!β, β@β, β#βμ κ°μ νΉμ λ¬Έμμ μΌμΉνμ§λ§ βaβ, β1βκ³Όλ μΌμΉνμ§ μμ΅λλ€.
- μ:
-
\s
(곡백 λ¬Έμ): 곡백 λ¬Έμ(μ€νμ΄μ€, ν, μ€λ°κΏ)μ μΌμΉν©λλ€.- μ:
\s
λ βHello Worldβμμ λ¨μ΄ μ¬μ΄μ 곡백과 μΌμΉν©λλ€.
- μ:
-
\S
(곡백 λ¬Έμκ° μλ): 곡백 λ¬Έμκ° μλ λͺ¨λ λ¬Έμμ μΌμΉν©λλ€.- μ:
\S
λ βHelloβμμ βHβ, βeβ, βlβ, βlβ, βoβμ κ°κ° μΌμΉνμ§λ§ 곡백과λ μΌμΉνμ§ μμ΅λλ€.
- μ:
-
^
(λ¬Έμμ΄μ μμ): λ¬Έμμ΄μ μμ λΆλΆμ μλ―Έν©λλ€.- μ:
^Hello
λ βHello, World!βμ μΌμΉνμ§λ§ βHe said Helloβμλ μΌμΉνμ§ μμ΅λλ€.
- μ:
-
$
(λ¬Έμμ΄μ λ): λ¬Έμμ΄μ λ λΆλΆμ μλ―Έν©λλ€.- μ:
World$
λ βHello, World!βμ μΌμΉνμ§λ§ βWorld is bigβκ³Όλ μΌμΉνμ§ μμ΅λλ€.
- μ:
-
\b
(λ¨μ΄ κ²½κ³): λ¨μ΄μ κ²½κ³(λ¨μ΄μ 곡백 λλ λΉλ¬Έμ μ¬μ΄)λ₯Ό μλ―Έν©λλ€.- μ:
\bcat\b
λ βcat is hereβμμ βcatβκ³Ό μΌμΉνμ§λ§, βconcatenationβμμλ μΌμΉνμ§ μμ΅λλ€.
- μ:
-
\B
(λΉλ¨μ΄ κ²½κ³): λ¨μ΄ κ²½κ³κ° μλ λΆλΆκ³Ό μΌμΉν©λλ€.- μ:
\Bcat\B
λ βconcatenationβμμ βcatβκ³Ό μΌμΉνμ§λ§, βcat is hereβμμλ μΌμΉνμ§ μμ΅λλ€.
- μ:
-
[]
(λ¬Έμ μ§ν©): λκ΄νΈ μμ μλ λ¬Έμ μ€ νλμ μΌμΉν©λλ€.- μ:
[abc]
λ βaβ, βbβ, βcβ μ€ νλμ μΌμΉν©λλ€. μλ₯Ό λ€μ΄, βappleβμμλ βaβ, βcatβμμλ βcβμ μΌμΉν©λλ€.
- μ:
-
*
(0ν μ΄μ λ°λ³΅): μμ λ¬Έμκ° 0λ² μ΄μ λ°λ³΅λ μ μμμ μλ―Έν©λλ€.- μ:
a*
λ βaβ, βaaβ, βaaaβμ²λΌ βaβκ° 0λ² μ΄μ λμ€λ λΆλΆκ³Ό μΌμΉν©λλ€.
- μ:
-
+
(1ν μ΄μ λ°λ³΅): μμ λ¬Έμκ° 1λ² μ΄μ λ°λ³΅λ μ μμμ μλ―Έν©λλ€.- μ:
a+
λ βaβ, βaaβ, βaaaβμ μΌμΉνμ§λ§, βbβμλ μΌμΉνμ§ μμ΅λλ€.
- μ:
-
?
(0ν λλ 1ν): μμ λ¬Έμκ° 0λ² λλ 1λ² λμ€λ κ²κ³Ό μΌμΉν©λλ€.- μ:
a?
λ βaβ λλ μ무 λ¬Έμλ μλ λΆλΆκ³Ό μΌμΉν©λλ€.
- μ:
-
{n}
(μ νν nν λ°λ³΅): μμ λ¬Έμκ° μ νν nλ² λμ€λ κ²κ³Ό μΌμΉν©λλ€.- μ:
a{3}
λ βaaaβμ μΌμΉνμ§λ§, βaaβ, βaaaaβμλ μΌμΉνμ§ μμ΅λλ€.
- μ:
-
νμ΄μ¬μμ
re
λͺ¨λ μ¬μ©νκΈ°
re
λͺ¨λμ νμ΄μ¬μμ μ κ·ννμμ μ§μνλ νμ€ λΌμ΄λΈλ¬λ¦¬μ
λλ€. μ΄λ₯Ό μ¬μ©νλ©΄ λ¬Έμμ΄ κ²μ, μΌμΉ μ¬λΆ νμΈ, μΉν λ±μ μμ
μ ν μ μμ΅λλ€.
re.search()
: λ¬Έμμ΄ λ΄μμ μ κ·ννμκ³Ό μΌμΉνλ 첫 λ²μ§Έ μμΉλ₯Ό λ°νν©λλ€.re.match()
: λ¬Έμμ΄μ μμ λΆλΆμμ μ κ·ννμκ³Ό μΌμΉνλμ§λ₯Ό νμΈν©λλ€.re.findall()
: μ κ·ννμκ³Ό μΌμΉνλ λͺ¨λ λΆλΆ λ¬Έμμ΄μ 리μ€νΈλ‘ λ°νν©λλ€.re.sub()
: μ κ·ννμμ μΌμΉνλ λΆλΆμ λ€λ₯Έ λ¬Έμμ΄λ‘ μΉνν©λλ€.re.split()
: μ κ·ννμμ λ°λΌ λ¬Έμμ΄μ λλλλ€.
1
2
3
4
5
6
7
8
import re
# κ°λ¨ν μμ
text = "The rain in Spain"
# 'rain'μ΄λΌλ λ¨μ΄κ° μλμ§ κ²μ
result = re.search(r"rain", text)
print(result) # <re.Match object; span=(4, 8), match='rain'>
3.1 re.search()
ν¨μ
re.search()
λ μ£Όμ΄μ§ λ¬Έμμ΄μμ μ κ·ννμκ³Ό μΌμΉνλ 첫 λ²μ§Έ λΆλΆμ λ°νν©λλ€. μΌμΉνλ ν¨ν΄μ΄ μμΌλ©΄ None
μ λ°νν©λλ€.
1
2
3
4
5
6
7
8
9
# μ΄λ©μΌ νμ μ°ΎκΈ°
email_text = "My email is example@mail.com"
email_pattern = r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"
email_match = re.search(email_pattern, email_text)
if email_match:
print(f"μ΄λ©μΌ μ£Όμ: {email_match.group()}")
else:
print("μ΄λ©μΌ μ£Όμλ₯Ό μ°Ύμ μ μμ΅λλ€.")
3.2 re.findall()
ν¨μ
re.findall()
ν¨μλ λ¬Έμμ΄ λ΄μμ μ κ·ννμκ³Ό μΌμΉνλ λͺ¨λ λΆλΆ λ¬Έμμ΄μ 리μ€νΈλ‘ λ°νν©λλ€.
1
2
3
4
5
text = "Call me at 123-456-7890 or 987-654-3210"
phone_pattern = r"\d{3}-\d{3}-\d{4}"
matches = re.findall(phone_pattern, text)
print(matches) # ['123-456-7890', '987-654-3210']
3.3 re.sub()
ν¨μ
re.sub()
ν¨μλ μ κ·ννμκ³Ό μΌμΉνλ λ¬Έμμ΄μ λ€λ₯Έ λ¬Έμμ΄λ‘ μΉννλ λ° μ¬μ©λ©λλ€.
1
2
3
text = "My phone number is 123-456-7890."
masked_text = re.sub(r"\d{3}-\d{3}-\d{4}", "XXX-XXX-XXXX", text)
print(masked_text) # My phone number is XXX-XXX-XXXX.
3.4 re.split()
ν¨μ
re.split()
ν¨μλ μ κ·ννμμ κΈ°μ€μΌλ‘ λ¬Έμμ΄μ λλ λ μ μ©ν©λλ€.
1
2
3
text = "apple, banana; orange, pineapple"
split_text = re.split(r"[;,]", text)
print(split_text) # ['apple', ' banana', ' orange', ' pineapple']
-
μ κ· ννμ μμ
π (μ°Έκ³ ) Notations
- μ κ·ννμ ν¨ν΄μ μμ±ν λ, νμ΄μ¬μμλ μ¬λμ(/)λ‘ κ°μΈλ λμ λ¬Έμμ΄ λ¦¬ν°λ΄ rββ μμ μμ±ν©λλ€. rμ βraw stringβμ μλ―Ένλ©°, μ΄ λ°©μμΌλ‘ μμ±νλ©΄ λ°±μ¬λμ() κ°μ νΉμ λ¬Έμκ° κ·Έλλ‘ μ λ¬λμ΄ μ κ·ννμμμ μ¬λ°λ₯΄κ² ν΄μλ©λλ€.
- νμ΄μ¬ λ§κ³ λ¨μ μ κ· ννμλ§μ νκΈ°ν λ,
^
κ³Ό$
λ λ¬Έμμ΄μ μμκ³Ό λμ μλ―Έν¨.- νμ΄μ¬μμλ μ κ·ννμμ μ¬λμ(
/
)λ‘ κ°μΈμ§ μκ³ , λ¬Έμμ΄ λ¦¬ν°λ΄(r""
)λ‘ μ¬μ©.
- νλκ·Έ (μ: /g): νμ΄μ¬μμλ /g κ°μ νλκ·Έ λμ , re λͺ¨λμμ μ΅μ μΌλ‘ νλκ·Έλ₯Ό μ λ¬ν©λλ€. μλ₯Ό λ€μ΄, μ¬λ¬ μ€μμ ν¨ν΄μ κ²μνκ³ μΆμΌλ©΄ re.MULTILINE νλκ·Έλ₯Ό μ¬μ©ν μ μμ΅λλ€.
/g
λ μ μ κ²μμ μλ―Ένμ§λ§, νμ΄μ¬μμλ νμ μμ.- νλκ·Έλ νμ΄μ¬μ re λͺ¨λμμ λ³λλ‘ μ²λ¦¬λ©λλ€.
4.1. μ΄λ©μΌ μ£Όμ κ²μ¦
1
/^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/
- μ€λͺ
: μ΄ μ κ·ννμμ μ΄λ©μΌ μ£Όμ νμμ κ²μ¦νλλ° μ¬μ©λ©λλ€. μ΄λ©μΌμ λ°λμ
@
κΈ°νΈκ° ν¬ν¨λμ΄ μκ³ , λ€μ λλ©μΈκ³Ό μ΅μμ λλ©μΈμ΄ μ΅λλ€.^[a-zA-Z0-9._%-]+
: μ΄λ©μΌ μ£Όμμ μ¬μ©μ μ΄λ¦ λΆλΆμ λ§€μΉ. λ¬Έμ, μ«μ, λ°μ€, μ λ±μ νμ©νλ©°, νλ μ΄μμ΄ λμμΌ ν¨.@[a-zA-Z0-9.-]+
:@
λ€μ λλ©μΈ μ΄λ¦μ λ§€μΉ. λ¬Έμ, μ«μ, μ , λμλ₯Ό νμ©.\.[a-zA-Z]{2,6}$
: λ§μ§λ§μΌλ‘ μ΅μμ λλ©μΈ λΆλΆμ λ§€μΉ. 2~6μ리μ λ¬Έμλ‘ λλμΌ ν¨.
Pythonμμμ μ¬μ© μμλ λ€μκ³Ό κ°μ΅λλ€.
1
2
3
4
5
6
7
8
9
10
import re
email_text = "My email is example@mail.com"
email_pattern = r"^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$"
email_match = re.search(email_pattern, email_text)
if email_match:
print(f"μ΄λ©μΌ μ£Όμ: {email_match.group()}")
else:
print("μ΄λ©μΌ μ£Όμλ₯Ό μ°Ύμ μ μμ΅λλ€.")
- μ¬μ© ν¨μ:
re.search()
λ λ¬Έμμ΄ λ΄μμ ν¨ν΄μ΄ μ²μμΌλ‘ μΌμΉνλ λΆλΆμ μ°Ύμ΅λλ€. μΌμΉνλ λΆλΆμ΄ μμΌλ©΄Match
κ°μ²΄λ₯Ό λ°ννκ³ , μμΌλ©΄None
μ λ°νν©λλ€.
-
μΆλ ₯ κ²°κ³Ό:
1 2 3 4 5
# μ λ ₯ 1 email_text = "My email is example@mail.com" # μΆλ ₯ 1 μ΄λ©μΌ μ£Όμλ₯Ό μ°Ύμ μ μμ΅λλ€.
1 2 3 4 5
# μ λ ₯ 2 email_text = "example@mail.com" # μΆλ ₯ 2 μ΄λ©μΌ μ£Όμ: example@mail.com
μ λ€λ₯Έκ°?
βοΈ μ΄λ©μΌ μ£Όμ κ²μ¦μμλ μ κ·ννμμ
^(λ¬Έμμ΄μ μμ)
κ³Ό$(λ¬Έμμ΄μ λ)
κ° ν¬ν¨λμ΄ μμ΅λλ€. μ΄ μλ―Έλ ν΄λΉ μ κ·ννμμ΄ λ¬Έμμ΄ μ μ²΄κ° μ΄λ©μΌ νμκ³Ό μ νν μΌμΉν΄μΌλ§ λ§€μΉλλ€λ κ²μ λλ€. μ¦, μ΄λ©μΌ μ΄μΈμ λ€λ₯Έ λ¬Έμμ΄μ΄ ν¬ν¨λμ΄ μμΌλ©΄ κ·Έ λ¬Έμμ΄ μ μ²΄κ° ν¨ν΄μ λ§μ§ μκΈ° λλ¬Έμ λ§€μΉλμ§ μμ΅λλ€.
4.2. URL λ§€μΉ
1
/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/
-
μ€λͺ : μ΄ μ κ·ννμμ μΉ URL νμμ λ§€μΉν©λλ€. http, https, λλ wwwλ‘ μμνκ³ , λλ©μΈ μ΄λ¦κ³Ό μ νμ μΌλ‘ 쿼리 μ€νΈλ§, νλκ·Έλ¨ΌνΈκ° ν¬ν¨λ μ μμ΅λλ€. μμλ‘ κ°μ Έμ λ΄€λλ° μκ° μ΄μμΌλ‘ λ§€μ΄ λ§μ΄λ€μπΆοΈπΆοΈ(μ€ν΅νμ λ λ©λλ€γ γ ) κ°κ° μμΈνκ² ν΄μν΄λ³΄κ² μ΅λλ€.
-
νλ‘ν μ½ λ§€μΉ:
([A-Za-z]{3,9}:(?:\/\/)?)
[A-Za-z]{3,9}
: 3~9κ°μ μνλ²³ λ¬Έμκ° ν¬ν¨λ λ¬Έμμ΄μ λ§€μΉν©λλ€. μ΄λhttp
,https
,ftp
,mailto
μ κ°μ μΈν°λ· νλ‘ν μ½μ λ§€μΉνλ λΆλΆμ λλ€.:
: νλ‘ν μ½ λ€μλ λ°λμ μ½λ‘ (:
)μ΄ λ°λΌμ΅λλ€.(?:\/\/)?
: μ νμ μΈ//
λ₯Ό λ§€μΉν©λλ€.(?:)
λ non-capturing groupμΌλ‘, μ΄ κ·Έλ£Ήμ μΊ‘μ²νμ§λ μμ§λ§//
μ체λ μμ΄μΌ νλ λΆλΆμ λλ€. κ·Έλ¬λ//
λ νμκ° μλκΈ° λλ¬Έμ?
λ₯Ό λΆμ¬μ μμ μλ μκ³ μμ μλ μλλ‘ ν©λλ€. (Ex.http://
,https://
,ftp://
λ±μ μ²λ¦¬)
-
λλ©μΈ μ¬μ©μ μ 보 λ° λλ©μΈ λ§€μΉ:
(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+
-
(?:[\-;:&=\+\$,\w]+@)?
: μ νμ μΌλ‘ μ¬μ©μ μ 보λ₯Ό ν¬ν¨ν μ μμ΅λλ€.- μλ₯Ό λ€μ΄
user:password@
μ²λΌ λλ©μΈ μ΄μ μ μ¬μ©μ μ΄λ¦κ³Ό λΉλ°λ²νΈλ₯Ό ν¬ν¨νλ κ²½μ°κ° μμ΅λλ€. [\-;:&=\+\$,\w]+
: μ΄ λΆλΆμμ μ¬μ©μ μ 보μ κ΄λ ¨λ λ€μν λ¬Έμλ₯Ό νμ©ν©λλ€.\w
λ μνλ²³, μ«μ, λ°μ€μ μλ―Έν©λλ€.\-;:&=\+\$
λ νμ©λ νΉμλ¬Έμλ€μ λλ€.
@
λ λ°λμ μμ΄μΌ νλ©°, μ¬μ©μ μ 보 λ€μ λμ€λ@
κΈ°νΈλ₯Ό μ²λ¦¬ν©λλ€. μ΄ λΆλΆμ μ νμ μ΄κΈ° λλ¬Έμ?
κ° λ€μ λΆμ΄ μμ΅λλ€.
- μλ₯Ό λ€μ΄
-
[A-Za-z0-9\.\-]+
: μ€μ λλ©μΈ μ΄λ¦μ λ§€μΉν©λλ€.[A-Za-z0-9]
: λλ©μΈμ λ¬Έμμ μ«μλ‘ μ΄λ£¨μ΄μ§ μ μμ΅λλ€.\.
: λλ©μΈ μ΄λ¦ λ΄μ μ (.
)μ΄ ν¬ν¨λ μ μμ΅λλ€.- μλ₯Ό λ€μ΄,
example.com
μμμ μ μ μ²λ¦¬νλ λΆλΆμ λλ€.
- μλ₯Ό λ€μ΄,
\-
: λλ©μΈ μ΄λ¦ λ΄μ νμ΄ν(-
)μ΄ ν¬ν¨λ μλ μμ΅λλ€.- μλ₯Ό λ€μ΄,
my-site.com
κ°μ λλ©μΈμ μ²λ¦¬ν©λλ€.
- μλ₯Ό λ€μ΄,
-
-
www λ§€μΉ λλ μ¬μ©μ μ 보 ν¬ν¨ κ°λ₯:
(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+
(?:www\.)
:www.
λ‘ μμνλ λλ©μΈμ λ§€μΉν©λλ€.- μ¬κΈ°μ non-capturing groupμ μ¬μ©ν κ²μ
www.
λ μμ§λ§ λ°λμ μΊ‘μ²ν νμκ° μλ λΆλΆμ΄κΈ° λλ¬Έμ λλ€.
- μ¬κΈ°μ non-capturing groupμ μ¬μ©ν κ²μ
|[\-;:&=\+\$,\w]+@
: λλ μ¬μ©μ μ λ³΄κ° ν¬ν¨λ νν(μμ μ€λͺ ν λΆλΆμ²λΌuser:password@
)λ₯Ό μ²λ¦¬ν©λλ€.
-
κ²½λ‘ λ§€μΉ:
((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?
-
(?:\/[\+~%\/\.\w\-_]*)?
: URLμ κ²½λ‘ μ²λ¦¬\/
: μ¬λμ(/
)λ‘ μμνλ κ²½λ‘λ₯Ό λνλ λλ€.- μλ₯Ό λ€μ΄,
/path/to/resource
μ κ°μ κ²½λ‘μ λλ€.
- μλ₯Ό λ€μ΄,
[\+~%\/\.\w\-_]*
: κ²½λ‘ λ΄μ νμ©λλ λ€μν λ¬Έμλ₯Ό μ²λ¦¬ν©λλ€.\w
: μνλ²³, μ«μ, λ°μ€(_
)μ μλ―Έν©λλ€.\-
: νμ΄ν(-
).\.
,\/
,\+
,%
: κ²½λ‘μ μμ£Ό λνλλ νΉμ λ¬Έμμ λλ€.
?
: μ΄ μ 체 κ·Έλ£Ήμ μ νμ μ΄λ―λ‘, κ²½λ‘κ° μμ μλ μμ΅λλ€.
-
\??
: 쿼리 μ€νΈλ§ μ²λ¦¬?
: μ νμ μΌλ‘ 쿼리 μ€νΈλ§μ΄ λΆμ μ μμ΅λλ€.- μλ₯Ό λ€μ΄,
?key=value
κ°μ ννμ λλ€.
- μλ₯Ό λ€μ΄,
\?
λ μ€μ 쿼리 μ€νΈλ§μ μμμ λνλ΄λ λ¬Όμν(?
)λ₯Ό λ§€μΉν©λλ€.?
λ λ¬Όμνκ° μμ μλ μμ μλ μμμ λνλ λλ€.
-
(?:[\-\+=&;%@\.\w_]*)
: 쿼리 μ€νΈλ§ μ²λ¦¬- 쿼리 μ€νΈλ§μ ν€-κ° μμμ νμ©λλ λ€μν λ¬Έμλ₯Ό μ²λ¦¬ν©λλ€.
[\-\+=&;%@\.\w_]*
: 쿼리 μ€νΈλ§μ ν¬ν¨λ μ μλ λ¬Έμμ λλ€.- μλ₯Ό λ€μ΄,
key=value&anotherKey=value2
μ²λΌ 볡μ‘ν ννμ 쿼리 μ€νΈλ§μ μ²λ¦¬ν©λλ€.
- μλ₯Ό λ€μ΄,
-
#?(?:[\.\!\/\\\w]*)
: ν΄μ νλκ·Έλ¨ΌνΈ μ²λ¦¬#?
: ν΄μ νλκ·Έλ¨ΌνΈλ₯Ό μ νμ μΌλ‘ μ²λ¦¬ν©λλ€. ν΄μ κΈ°νΈ(#
)λ μμ μλ, μμ μλ μμ΅λλ€.(?:[\.\!\/\\\w]*)
: ν΄μ νλκ·Έλ¨ΌνΈ λ΄μ ν¬ν¨λ μ μλ λ¬Έμμ λλ€. ν΄μ λ€μλ μΌλ°μ μΌλ‘ μνλ²³, μ«μ, μ¬λμ λ±μ΄ ν¬ν¨λ©λλ€.- μλ₯Ό λ€μ΄
#section1
κ°μ ννλ₯Ό μ²λ¦¬ν©λλ€.
- μλ₯Ό λ€μ΄
-
-
Pythonμμμ μ¬μ© μμλ λ€μκ³Ό κ°μ΅λλ€.
1
2
3
4
5
6
7
8
import re
text = "Visit us at https://www.example.com or http://example.org"
url_pattern = r"((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)"
urls = re.findall(url_pattern, text)
for url in urls:
print(f"URL: {url[0]}")
- μ¬μ© ν¨μ:
re.findall()
μ λ¬Έμμ΄ λ΄μμ ν¨ν΄κ³Ό μΌμΉνλ λͺ¨λ λΆλΆμ 리μ€νΈλ‘ λ°νν©λλ€.
- μΆλ ₯ κ²°κ³Ό:
1 2
URL: https://www.example.com URL: http://example.org
4.3. μ νλ²νΈ (νκ΅ ν΄λν° λ²νΈ νμ)
1
/010-\d{4}-\d{4}/
- μ€λͺ
: μ΄ μ κ·ννμμ νκ΅μ νμ€μ μΈ ν΄λμ ν λ²νΈ νμμ λ§€μΉν©λλ€.
010-
: μ νλ²νΈλ νμ β010-βμΌλ‘ μμν©λλ€.\d{4}-\d{4}
: κ°κ° 4μ리μ μ«μκ° λμ€λ©°, νμ΄ν(-
)μΌλ‘ ꡬλΆλ©λλ€.
Pythonμμμ μ¬μ© μμλ λ€μκ³Ό κ°μ΅λλ€.
1
2
3
4
5
6
7
import re
text = "μ°λ½μ²λ 010-1234-5678 λλ 010-9876-5432μ
λλ€."
phone_pattern = r"010-\d{4}-\d{4}"
matches = re.findall(phone_pattern, text)
print(matches) # ['010-1234-5678', '010-9876-5432']
- μ¬μ© ν¨μ:
re.findall()
μ λ¬Έμμ΄ λ΄μμ ν¨ν΄κ³Ό μΌμΉνλ λͺ¨λ μ νλ²νΈλ₯Ό 리μ€νΈλ‘ λ°νν©λλ€.
- μΆλ ₯ κ²°κ³Ό:
1
['010-1234-5678', '010-9876-5432']
4.4. λ μ§ νμ (MM/DD/YYYY)
1
/^[0-3]?[0-9](?:\/|\.|-)[0-3]?[0-9](?:\/|\.|-)[1-9]\d{3}$/
- μ€λͺ
: μ΄ μ κ·ννμμ MM/DD/YYYY νμμ λ μ§λ₯Ό λ§€μΉν©λλ€.
[0-3]?[0-9]
: 첫 λ²μ§Έ λ μ리λ λ μ§μ μΌ(day)μ μλ―Έν©λλ€.(?:\/|\.|-)
: κ΅¬λΆ κΈ°νΈλ₯Ό μΊ‘μ²νμ§ μλλ‘ non-capturing groupμ μ¬μ©ν©λλ€.- μ΄ λΆλΆμμ κ΅¬λΆ κΈ°νΈ(\/, ., -)λ μ¬μ ν λ§€μΉλμ§λ§ μΊ‘μ²λμ§ μμΌλ―λ‘ κ²°κ³Όμ ν¬ν¨λμ§ μμ΅λλ€.
[0-3]?[0-9]
: λ λ²μ§Έ λ μ리λ μ(month)μ μλ―Έν©λλ€.(?:\/|\.|-)
: λ€μ non-capturing groupμ μ¬μ©νμ¬ κ΅¬λΆ κΈ°νΈλ₯Ό λ§€μΉλ§ νκ³ μΊ‘μ²νμ§ μμ΅λλ€.[1-9]\d{3}
: λ§μ§λ§μΌλ‘ μ°λ(year)λ₯Ό μλ―Έν©λλ€. 1000λ μ΄νμ λ€ μ리 μ«μλ₯Ό λ§€μΉν©λλ€.
(μ©μ΄) Capturing & Non-Capturing Group
Capturing Group
: ( ) μμ μ μλ ν¨ν΄μ μΊ‘μ²νκ³ κ²°κ³Όλ‘ λ°νν©λλ€.Non-Capturing Group
: ( ? : ) μμ μ μλ ν¨ν΄μ μΊ‘μ²νμ§ μκ³ , ν¨ν΄ λ§€μΉμ μΌλΆλΆμΌλ‘λ§ μ¬μ©ν©λλ€. κ²°κ³Όμ ν¬ν¨λμ§ μμ΅λλ€.
(μ©μ΄) ν¨ν΄μ μΊ‘μ³νλ€κ³ ?
- μ κ·ννμμμ μΊ‘μ² κ·Έλ£Ήμ μ¬μ©νλ©΄, μκ΄νΈ
()
μμ λ€μ΄μλ λΆλΆμ κ²°κ³Όμ ν¬ν¨νκ±°λ, κ·Έλ£Ήλ³λ‘ λ°λ‘ μ¬μ©ν μ μλ ννλ‘ μ²λ¦¬ν©λλ€.
- μΊ‘μ² κ·Έλ£Ήμ λ§€μΉλ κ²°κ³Όλ₯Ό λ³λλ‘ μ μ₯νκ±°λ, λμ€μ λ€μ μ¬μ©ν μ μλ νΉλ³ν κΈ°λ₯μ μ 곡ν©λλ€.
- μΊ‘μ² κ·Έλ£Ήμ μ κ·ννμμμ λ§€μΉλ λΆλΆμ λ³λλ‘ μ μ₯νκ±°λ, λμ€μ μ°Έμ‘°ν μ μκ² ν΄μ€λλ€.
- μλ₯Ό λ€μ΄,
re.findall()
μ μΊ‘μ² κ·Έλ£Ήμ΄ μλ€λ©΄ ν΄λΉ κ·Έλ£Ήμ μΌμΉ νλͺ©λ§ κ²°κ³Όλ‘ λ°νν©λλ€.
1 2 3 4 5 import re text = "My email is example@mail.com" email_pattern = r"([a-zA-Z0-9._%-]+)@([a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})" matches = re.findall(email_pattern, text) print(matches) # [('example', 'mail.com')]
- μ¬κΈ°μ
([a-zA-Z0-9._%-]+)
: μ΄λ©μΌμ μ¬μ©μ μ΄λ¦ λΆλΆμ μΊ‘μ²ν©λλ€.([a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})
: λλ©μΈ λΆλΆμ μΊ‘μ²ν©λλ€.- κ²°κ³Όλ λ κ°μ κ·Έλ£ΉμΌλ‘ λΆλ¦¬λμ΄ λ°νλ©λλ€: (βexampleβ, βmail.comβ).
- λ°λλ‘, non-capturing group(
(?: ...)
)μ ν΄λΉ ν¨ν΄μ λ§€μΉνλ κ²°κ³Όλ‘ λ°ννμ§ μκ³ , λ¨μ§ ν¨ν΄μ ꡬμ±νλ μμλ‘λ§ μ¬μ©λ©λλ€.
1 2 3 4 5 import re text = "My email is example@mail.com" email_pattern = r"(?:[a-zA-Z0-9._%-]+)@(?:[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})" matches = re.findall(email_pattern, text) print(matches) # ['example@mail.com']
- μ¬κΈ°μ μΊ‘μ²νμ§ μλ κ·Έλ£Ή
(?: ...)
λ₯Ό μ¬μ©νμκΈ° λλ¬Έμ, μ΄λ©μΌμ λΆλΆμ μΊ‘μ²νμ§ μκ³ , μ 체 μ΄λ©μΌλ§ λ§€μΉνκ³ κ²°κ³Όλ‘ λ°νν©λλ€: βexample@mail.comβ
Pythonμμμ μ¬μ© μμλ λ€μκ³Ό κ°μ΅λλ€.
1
2
3
4
5
6
7
8
9
import re
text = "The event is on 12/25/2024 or 01-01-2025."
# μΊ‘μ² κ·Έλ£Ήμ non-capturing groupμΌλ‘ λ³κ²½
date_pattern = r"[0-3]?[0-9](?:\/|\.|-)[0-3]?[0-9](?:\/|\.|-)[1-9]\d{3}"
dates = re.findall(date_pattern, text)
print(dates) # ['12/25/2024', '01-01-2025']
- μ¬μ© ν¨μ:
re.findall()
μ λ¬Έμμ΄ λ΄μμ ν¨ν΄κ³Ό μΌμΉνλ λͺ¨λ λ μ§λ₯Ό 리μ€νΈλ‘ λ°νν©λλ€.
- μΆλ ₯ κ²°κ³Ό:
1
['12/25/2024', '01-01-2025']
4.5. κ°λ ₯ν λΉλ°λ²νΈ κ²μ¦
1
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{10,}$/
- μ€λͺ
: μ΄ μ κ·ννμμ λλ¬Έμ, μλ¬Έμ, μ«μ, νΉμ λ¬Έμλ₯Ό λͺ¨λ ν¬ν¨ν μ΅μ 10μ리μ κ°λ ₯ν λΉλ°λ²νΈλ₯Ό λ§€μΉν©λλ€.
(?=.*[a-z])
: μλ¬Έμ μ΅μ νλκ° ν¬ν¨λμ΄μΌ ν¨.(?=.*[A-Z])
: λλ¬Έμ μ΅μ νλκ° ν¬ν¨λμ΄μΌ ν¨.(?=.*\d)
: μ«μ μ΅μ νλκ° ν¬ν¨λμ΄μΌ ν¨.(?=.*[@$!%*?&])
: νΉμ λ¬Έμ μ΅μ νλκ° ν¬ν¨λμ΄μΌ ν¨.[A-Za-z\d@$!%*?&]{10,}
: μ 쑰건μ λ§μ‘±νλ©° 10μ리 μ΄μμ΄μ΄μΌ ν¨.
Pythonμμμ μ¬μ© μμλ λ€μκ³Ό κ°μ΅λλ€.
1
2
3
4
5
6
7
8
9
import re
password = "StrongP@ssword1"
password_pattern = r"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{10,}$"
if re.match(password_pattern, password):
print("λΉλ°λ²νΈκ° μ ν¨ν©λλ€.")
else:
print("λΉλ°λ²νΈκ° μ ν¨νμ§ μμ΅λλ€.")
- μ¬μ© ν¨μ:
re.match()
λ λ¬Έμμ΄μ μμλΆν° μ κ·ννμκ³Ό μΌμΉνλμ§λ₯Ό νμΈν©λλ€.
- μΆλ ₯ κ²°κ³Ό:
1
λΉλ°λ²νΈκ° μ ν¨ν©λλ€.
4.6. μ¬μ©μλͺ κ²μ¦ (μνλ²³κ³Ό μ«μ, νΉμ κΈΈμ΄)
1
/^[a-zA-Z0-9_-]{3,16}$/
- μ€λͺ
: μ΄ μ κ·ννμμ 3~16μμ μνλ²³, μ«μ, λ°μ€ λλ λμλ‘ κ΅¬μ±λ μ¬μ©μλͺ
μ λ§€μΉν©λλ€.
[a-zA-Z0-9_-]
: μνλ²³, μ«μ, λ°μ€, λμλ₯Ό νμ©ν©λλ€.{3,16}
: μ΅μ 3μ, μ΅λ 16μκΉμ§ νμ©ν©λλ€.
Pythonμμμ μ¬μ© μμλ λ€μκ³Ό κ°μ΅λλ€.
1
2
3
4
5
6
7
8
9
import re
username = "user_name123"
username_pattern = r"^[a-zA-Z0-9_-]{3,16}$"
if re.match(username_pattern, username):
print("μ¬μ©μλͺ
μ΄ μ ν¨ν©λλ€.")
else:
print("μ¬μ©μλͺ
μ΄ μ ν¨νμ§ μμ΅λλ€.")
- μ¬μ© ν¨μ:
re.match()
λ λ¬Έμμ΄μ μμλΆν° μ κ·ννμκ³Ό μΌμΉνλμ§λ₯Ό νμΈν©λλ€.
- μΆλ ₯ κ²°κ³Ό:
1
μ¬μ©μλͺ μ΄ μ ν¨ν©λλ€.
4.7. IP μ£Όμ κ²μ¦ (IPv4 νμ)
1
/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
- μ€λͺ
: μ΄ μ κ·ννμμ IPv4 νμμ IP μ£Όμλ₯Ό λ§€μΉν©λλ€.
25[0-5]
: 250~255 λ²μμ μ«μ.2[0-4][0-9]
: 200~249 λ²μμ μ«μ.[01]?[0-9][0-9]?
: 0~199 λ²μμ μ«μ.\.
: κ° μ«μ ꡬκ°μ μ (.
)μΌλ‘ ꡬλΆλ©λλ€.
Pythonμμμ μ¬μ© μμλ λ€μκ³Ό κ°μ΅λλ€.
1
2
3
4
5
6
7
8
9
import re
ip = "192.168.0.1"
ip_pattern = r"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
if re.match(ip_pattern, ip):
print("IP μ£Όμκ° μ ν¨ν©λλ€.")
else:
print("IP μ£Όμκ° μ ν¨νμ§ μμ΅λλ€.")
- μ¬μ© ν¨μ:
re.match()
λ λ¬Έμμ΄μ μμλΆν° μ κ·ννμκ³Ό μΌμΉνλμ§λ₯Ό νμΈν©λλ€.
- μΆλ ₯ κ²°κ³Ό:
1
IP μ£Όμκ° μ ν¨ν©λλ€.
4.8. μ«μλ§ νμ©
1
/^\d+$/
- μ€λͺ
: μ΄ μ κ·ννμμ μ«μλ‘λ§ κ΅¬μ±λ λ¬Έμμ΄μ λ§€μΉν©λλ€.
^\d+$
: μ«μ(\d
)κ° 1ν μ΄μ (+
) λ°λ³΅λλ©°, λ¬Έμμ΄μ μμ(^
)κ³Ό λ($
)μ΄ μ«μμ¬μΌ ν¨.
Pythonμμμ μ¬μ© μμλ λ€μκ³Ό κ°μ΅λλ€.
1
2
3
4
5
6
7
8
9
import re
text = "12345"
number_pattern = r"^\d+$"
if re.match(number_pattern, text):
print("μ«μλ§ ν¬ν¨λ λ¬Έμμ΄μ
λλ€.")
else:
print("μ«μλ§ ν¬ν¨λμ§ μμ λ¬Έμμ΄μ
λλ€.")
- μ¬μ© ν¨μ:
re.match()
λ λ¬Έμμ΄μ μμλΆν° μ κ·ννμκ³Ό μΌμΉνλμ§λ₯Ό νμΈν©λλ€.
- μΆλ ₯ κ²°κ³Ό:
1
μ«μλ§ ν¬ν¨λ λ¬Έμμ΄μ λλ€.
4.9. μνλ²³κ³Ό μ«μλ§ νμ© (곡백 μμ΄)
1
/^[a-zA-Z0-9]*$/
- μ€λͺ
: μ΄ μ κ·ννμμ 곡백 μμ΄ μνλ²³κ³Ό μ«μλ‘λ§ μ΄λ£¨μ΄μ§ λ¬Έμμ΄μ λ§€μΉν©λλ€.
[a-zA-Z0-9]
: μνλ²³ λμλ¬Έμμ μ«μ.*
: 0ν μ΄μ λ°λ³΅μ νμ©.
Pythonμμμ μ¬μ© μμλ λ€μκ³Ό κ°μ΅λλ€.
1
2
3
4
5
6
7
8
9
import re
text = "Hello123"
alnum_pattern = r"^[a-zA-Z0-9]*$"
if re.match(alnum_pattern, text):
print("μνλ²³κ³Ό μ«μλ‘λ§ κ΅¬μ±λ λ¬Έμμ΄μ
λλ€.")
else:
print("λ¬Έμμ΄μ λ€λ₯Έ λ¬Έμκ° ν¬ν¨λμ΄ μμ΅λλ€.")
- μ¬μ© ν¨μ:
re.match()
λ λ¬Έμμ΄μ μμλΆν° μ κ·ννμκ³Ό μΌμΉνλμ§λ₯Ό νμΈν©λλ€.
- μΆλ ₯ κ²°κ³Ό:
1
μνλ²³κ³Ό μ«μλ‘λ§ κ΅¬μ±λ λ¬Έμμ΄μ λλ€.
4.10. μ μ©μΉ΄λ λ²νΈ κ²μ¦
1
/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6011[0-9]{12}|622((12[6-9]|1[3-9][0-9])|([2-8][0-9][0-9])|(9(([0-1][0-9])|(2[0-5]))))[0-9]{10}|64[4-9][0-9]{13}|65[0-9]{14}|3(?:0[0-5]|[68][0-9])[0-9]{11}|3[47][0-9]{13})*$/
- μ€λͺ
: μ΄ μ κ·ννμμ λ€μν μ μ©μΉ΄λ νμμ λ§€μΉν©λλ€. λΉμ, λ§μ€ν°μΉ΄λ, λμ€μ»€λ² μΉ΄λ λ±μ κ²μ¦ν μ μμ΅λλ€.
4[0-9]{12}(?:[0-9]{3})?
: λΉμ μΉ΄λ.5[1-5][0-9]{14}
: λ§μ€ν°μΉ΄λ.6011[0-9]{12}
: λμ€μ»€λ² μΉ΄λ.65[0-9]{14}
: λ λ€λ₯Έ μΉ΄λ νμ.
Pythonμμμ μ¬μ© μμλ λ€μκ³Ό κ°μ΅λλ€.
1
2
3
4
5
6
7
8
9
10
import re
text = "My card number is 4111-1111-1111-1111"
card_pattern = r"(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6011[0-9]{12}|65[0-9]{14})"
card_match = re.search(card_pattern, text.replace("-", ""))
if card_match:
print("μ μ©μΉ΄λ λ²νΈκ° μ ν¨ν©λλ€.")
else:
print("μ μ©μΉ΄λ λ²νΈκ° μ ν¨νμ§ μμ΅λλ€.")
- μ¬μ© ν¨μ:
re.search()
λ λ¬Έμμ΄ λ΄μμ ν¨ν΄μ΄ μΌμΉνλ λΆλΆμ μ°Ύμ΅λλ€.
- μΆλ ₯ κ²°κ³Ό:
1
μ μ©μΉ΄λ λ²νΈκ° μ ν¨ν©λλ€.
4.11. νκΈλ§ ν¬ν¨νλ λ¬Έμμ΄ κ²μ¬
1
/^[κ°-ν£]+$/
- μ€λͺ
: μ΄ μ κ·ννμμ νκΈ λ¬Έμλ§μΌλ‘ μ΄λ£¨μ΄μ§ λ¬Έμμ΄μ λ§€μΉν©λλ€.
[κ°-ν£]
: νκΈ μμ±ν λ²μλ₯Ό μλ―Έν©λλ€.
Pythonμμμ μ¬μ© μμλ λ€μκ³Ό κ°μ΅λλ€.
1
2
3
4
5
6
7
8
9
import re
text = "μλ
νμΈμ"
hangul_pattern = r"^[κ°-ν£]+$"
if re.match(hangul_pattern, text):
print("νκΈλ‘λ§ μ΄λ£¨μ΄μ§ λ¬Έμμ΄μ
λλ€.")
else:
print("νκΈ μ΄μΈμ λ¬Έμκ° ν¬ν¨λμ΄ μμ΅λλ€.")
-
μ¬μ© ν¨μ:
re.match()
λ λ¬Έμμ΄μ μμλΆν° μ κ·ννμκ³Ό μΌμΉνλμ§λ₯Ό νμΈν©λλ€. -
μΆλ ₯ κ²°κ³Ό:
1
νκΈλ‘λ§ μ΄λ£¨μ΄μ§ λ¬Έμμ΄μ λλ€.
4.12. νκΈ ν¬ν¨ μ¬λΆ κ²μ¬
1
/[κ°-ν£]/
- μ€λͺ
: μ΄ μ κ·ννμμ λ¬Έμμ΄μ νκΈμ΄ ν¬ν¨λμ΄ μλμ§ μ¬λΆλ₯Ό κ²μ¬ν©λλ€.
[κ°-ν£]
: νκΈ μμ±ν λ¬Έμλ₯Ό μλ―Έν©λλ€.
Pythonμμμ μ¬μ© μμλ λ€μκ³Ό κ°μ΅λλ€.
1
2
3
4
5
6
7
8
9
import re
text = "Hello, μλ
νμΈμ!"
hangul_included_pattern = r"[κ°-ν£]"
if re.search(hangul_included_pattern, text):
print("λ¬Έμμ΄μ νκΈμ΄ ν¬ν¨λμ΄ μμ΅λλ€.")
else:
print("λ¬Έμμ΄μ νκΈμ΄ ν¬ν¨λμ΄ μμ§ μμ΅λλ€.")
- μ¬μ© ν¨μ:
re.search()
λ λ¬Έμμ΄ λ΄μμ ν¨ν΄μ΄ μ²μμΌλ‘ μΌμΉνλ λΆλΆμ μ°Ύμ΅λλ€.
- μΆλ ₯ κ²°κ³Ό:
1
λ¬Έμμ΄μ νκΈμ΄ ν¬ν¨λμ΄ μμ΅λλ€.
4.13. μμ±ν νκΈ κ²μ¬ (μμ, λͺ¨μ μ μΈ)
1
/^[κ°-ν£]*$/
- μ€λͺ : μ΄ μ κ·ννμμ μμ±ν νκΈλ‘λ§ κ΅¬μ±λ λ¬Έμμ΄μ λ§€μΉν©λλ€. μμ λλ λͺ¨μλ§μΌλ‘ μ΄λ£¨μ΄μ§ λ¬Έμμ΄μ λ§€μΉλμ§ μμ΅λλ€.
Pythonμμμ μ¬μ© μμλ λ€μκ³Ό κ°μ΅λλ€.
1
2
3
4
5
6
7
8
9
import re
text = "κ°λλ€λΌλ§λ°μ¬"
hangul_complete_pattern = r"^[κ°-ν£]*$"
if re.match(hangul_complete_pattern, text):
print("μμ±ν νκΈλ‘λ§ μ΄λ£¨μ΄μ§ λ¬Έμμ΄μ
λλ€.")
else:
print("μμ±ν νκΈ μΈμ λ¬Έμκ° ν¬ν¨λμ΄ μμ΅λλ€.")
- μ¬μ© ν¨μ:
re.match()
λ λ¬Έμμ΄μ μμλΆν° μ κ·ννμκ³Ό μΌμΉνλμ§λ₯Ό νμΈν©λλ€.
- μΆλ ₯ κ²°κ³Ό:
1
μμ±ν νκΈλ‘λ§ μ΄λ£¨μ΄μ§ λ¬Έμμ΄μ λλ€.
4.14. νκΈ, μμ, λͺ¨μ λͺ¨λ ν¬ν¨
1
/^[γ±-γ
γ
-γ
£κ°-ν£]*$/
- μ€λͺ
: μ΄ μ κ·ννμμ νκΈ, μμ, λͺ¨μμ΄ λͺ¨λ ν¬ν¨λ λ¬Έμμ΄μ λ§€μΉν©λλ€.
[γ±-γ γ -γ £κ°-ν£]
: νκΈ μμ, λͺ¨μ, μμ±ν λ¬Έμλ₯Ό λͺ¨λ ν¬ν¨.
Pythonμμμ μ¬μ© μμλ λ€μκ³Ό κ°μ΅λλ€.
1
2
3
4
5
6
7
8
9
import re
text = "γ
γ±ν"
hangul_full_pattern = r"^[γ±-γ
γ
-γ
£κ°-ν£]*$"
if re.match(hangul_full_pattern, text):
print("νκΈ(μμ, λͺ¨μ ν¬ν¨)λ‘λ§ μ΄λ£¨μ΄μ§ λ¬Έμμ΄μ
λλ€.")
else:
print("νκΈ μ΄μΈμ λ¬Έμκ° ν¬ν¨λμ΄ μμ΅λλ€.")
- μ¬μ© ν¨μ:
re.match()
λ λ¬Έμμ΄μ μμλΆν° μ κ·ννμκ³Ό μΌμΉνλμ§λ₯Ό νμΈν©λλ€.
- μΆλ ₯ κ²°κ³Ό:
1
νκΈ(μμ, λͺ¨μ ν¬ν¨)λ‘λ§ μ΄λ£¨μ΄μ§ λ¬Έμμ΄μ λλ€.
4.15. λ¬Έμλ₯Ό μ μΈν νΉμ κΈ°νΈ μ κ±°
1
/[^a-zA-Z0-9κ°-ν£\s]/g
- μ€λͺ
: μ΄ μ κ·ννμμ μνλ²³, μ«μ, νκΈ, 곡백μ μ μΈν λͺ¨λ νΉμ λ¬Έμλ₯Ό μ κ±°ν©λλ€.
[^a-zA-Z0-9κ°-ν£\s]
: μνλ²³, μ«μ, νκΈ, 곡백μ μ μΈν λͺ¨λ λ¬Έμλ₯Ό μλ―Έ.
Pythonμμμ μ¬μ© μμλ λ€μκ³Ό κ°μ΅λλ€.
1
2
3
4
5
import re
text = "μλ
νμΈμ! Hello, World! 123 @#$%^&*"
cleaned_text = re.sub(r'[^a-zA-Z0-9κ°-ν£\s]', '', text)
print(cleaned_text) # μΆλ ₯: μλ
νμΈμ Hello World 123
- μ¬μ© ν¨μ:
re.sub()
λ μ κ·ννμμ μΌμΉνλ λͺ¨λ λΆλΆμ μ§μ ν λ¬Έμμ΄λ‘ μΉνν©λλ€.
- μΆλ ₯ κ²°κ³Ό:
1
μλ νμΈμ Hello World 123
-
λ§μΉλ©°
νμ΄μ¬μ re
λͺ¨λκ³Ό μ κ·ννμμ νμ©νλ©΄ 볡μ‘ν λ¬Έμμ΄ μ²λ¦¬λ₯Ό μμ½κ² ν μ μμ΅λλ€. μ΄λ² ν¬μ€νΈμμ λ€λ£¬ κΈ°λ³Έμ μΈ μ κ·ννμ ν¨ν΄κ³Ό re
λͺ¨λμ ν¨μλ€μ μ νμ©νλ©΄ λ€μν ν
μ€νΈ λ°μ΄ν°μμ ν¨ν΄μ μ°Ύμλ΄κ³ , λ³ννκ±°λ νμν μ 보λ₯Ό μΆμΆνλ μμ
μ λ ν¨μ¨μ μΌλ‘ ν μ μμ΅λλ€.