정규 표현식 살펴보기
정규 표현식이란?
복잡한 문자열을 처리할 때 사용하는 기법, 모든 언어 공통
정규 표현식은 왜 필요한가?
park 800905-1049116
kim 700905-1059119
주민등록번호의 뒷자리를 * 문자로 변경하시오 1
data = """
park 800905-1049118
kim 700905-1050119
"""
result = []
for line in data.split("\n"):
word_result = []
for word in line.split(" "):
if len(word) == 14 and word[:6].isdigit() and word[7:].isdigit():
word = word[:6] + "-" + "*******"
word_result.append(word)
result.append(" ".join(word_result))
print("\n".join(result))
주민등록번호의 뒷자리를 * 문자로 변경하시오 2
import re
data = """
park 800905-1049118
kim 700905-1059119
"""
pat = re.compile("(\d{6})[-]\d{7}")
print(pat.sub("\g<1>-*******", data))
정규 표현식 시작하기
문자 클래스 [ ]
[abc]
- [] 사이의 문자들과 매치
- "a"는 정규식과 일치하는 문자인 "a"가 있으므로 매치
- "before"는 정규식과 일치하는 문자인 "b"가 있으므로 매치
- "dude"는 정규식과 일치하는 문자인 a, b, c 중 어느 하나도 포함하고 있지 않으므로 매치되지 않음
- 하이픈을 사용하여 From-To로 표현 가능
º EX) [a-c] = [abc], [0-5] = [012345]
Dot(.)
a.b
- 줄바꿈(\n)을 제외한 모든 문자와 매치
- "aab"는 가운데 문자 "a"가 모든 문자를 의미하는 '.'과 일치하므로 정규식과 매치
- "a0b"는 가운데 문자 "0"가 모든 문자를 의미하는 '.'과 일치하므로 정규식과 매치
- "abc"는 "a"문자와 "b"문자 사이에 어떤 문자라도 하나는 있어야 하는 이 정규식과 일치하지 않으므로 매치되지 않는다
반복(*)
ca*t
- "ct"는 "a"가 0번 반복되어 매치
- "cat"는 "a"가 0번 이상 반복되어 매치 (1번 반복)
- "caaat"는 "a"가 0번 이상 반복되어 매치 (3번 반복)
반복(+)
ca+t
- "ct"는 "a"가 0번 반복되어 매치되지 않음
- "cat"는 "a"가 1번 이상 반복되어 매치 (1번 반복)
- "caaat"는 "a"가 1번 이상 반복되어 매치 (3번 반복)
반복({m, n}, ?)
ca{2}t
- "cat"는 "a"가 1번만 반복되어 매치되지 않음
- "caat"는 "a"가 2번 반복되어 매치
ca{2, 5}t
- "cat"는 "a"가 1번만 반복되어 매치되지 않음
- "caat"는 "a"가 2번 반복되어 매치
- "caaaaat"는 "a"가 5번 반복되어 매치
ab?c
- "abc"는 "b"가 1번 사용되어 매치
- "ac"는 "b"가 0번 사용되어 매치
? == {0, 1}와 같은 표현
파이썬에서 정규 표현식을 지원하는 re 모듈
import re
p = re.compile('ab*')
match
import re
p = re.compile('[a-z]+')
m = p.match("python")
print(m)
<_sre.SRE_Match object at 0x01F3F9F8>
m = p.match("3 python")
print(m)
None
search
import re
p = re.compile('[a-z]+')
m = p.search("python")
print(m)
<_sre.SRE_Match object at 0x01F3FA68>
m = p.search("3 python")
print(m)
<_sre.SRE_Match object at 0x01F3FA30>
findall
>>> import re
>>> p = re.compile('[a-z]+')
>>> result = p.findall("life is too short")
>>> print(result)
['life', 'is', 'too', 'short']
finditer
>>> import re
>>> p = re.compile('[a-z]+')
>>> result = p.finditer("life is too short")
>>> print(result)
<callable_iterator object at 0x01F5E390>
>>> for r in result: print(r)
...
<_sre.SRE_Match object at 0x01F3F9F8>
<_sre.SRE_Match object at 0x01F3FAD8>
<_sre.SRE_Match object at 0x01F3FAA0>
<_sre.SRE_Match object at 0x01F3F9F8>
match 객체의 메서드 1
method | 목적 |
group() | 매치된 문자열을 리턴한다 |
start() | 매치된 문자열의 시작 위치를 리턴한다 |
end() | 매치된 문자열의 끝 위치를 리턴한다 |
span() | 매치된 문자열의 (시작, 끝)에 해당되는 튜플을 리턴한다 |
컴파일 옵션, DOTALL, S
import re
p = re.compile('a.b')
m = p.match('a\nb')
print(m)
None
p = re.compile('a.b', re.DOTALL)
m = p.match('a\nb')
print(m)
<_sre.SRE_Match object at 0x01FCF3D8)
컴파일 옵션, IGNORECASE, I
>>> p = re.compile('[a-z]', re.I)
>>> p.match('python')
<_sre.SRE_Match object at 0x01FCFA30>
>>> p.match('Python')
<_sre.SRE_Match object at 0x01FCFA68>
>>> p.match('PYTHON')
<_sre.SRE_Match object at 0x01FCF9f8>
컴파일 옵션, MULTILINE, M
import re
p = re.compile("^python\s\w+", re.MULTILINE)
data = """python one
life is too short
python two
you need python
python three"""
print(p.findall(data))
컴파일 옵션, VERBOSE, X
charref = re.compile(r'&[#](0[0-7]+|[0-9]+|x[0-9a-fA-F]+);')
charref = re.compile(r"""
&[#] # Start of a numeric entity reference
(
0[0-7]+ # Octal form
| [0-9]+ # Decimal form
| x[0-9a-fA-F]+ # Hexadecimal form
)
; # Trailing semicolon
""", re.VERBOSE)
백슬래시 문제
\section
p = re.compile('\\section')
p = re.compile('\\\\section')
p = re.compile(r'\\section')
강력한 정규 표현식의 세계로
메타문자 |
p = re.compile('Crow|Servo')
m = p.match('CrowHello')
print(m)
<_sre.SRE_Match object; span=(0, 4), match='Crow'>
메타문자 ^
print(re.search('^Life', 'Life is too short'))
<_sre.SRE_Match object at 0x01FCF3D8>
print(re.search('^Life', 'My Life'))
None
메타문자 $
print(re.search('short$', 'Life is too short'))
<_sre.SRE_Match object at 0x01F6F3D8>
print(re.search('short$', 'Life is too short, you need
python'))
None
메타문자 \b
p = re.compile(r'\bclass\b')
print(p.search('no class at all'))
<_sre.SRE_Match object at 0x01F6F3D8>
print(p.search('the declassified algorithm'))
None
print(p.search('one subclass is'))
None
그룹핑 1
(ABC)+
p = re.compile('(ABC)+')
m = p.search('ABCABCABC OK?')
print(m)
<_sre.SRE_Match object at 0x01F7B320>
print(m.group())
ABCABCABC
'Programming > PYTHON' 카테고리의 다른 글
파이썬 기본 문법 정리 (0) | 2022.06.01 |
---|---|
프로젝트 완성 후, 자료구조 & 알고리즘 공부 및 코딩테스트 준비 (0) | 2022.05.30 |
파이썬 내가 프로그램을 만들 수 있을까? (0) | 2022.03.07 |
파이썬 날개 달기 (0) | 2022.03.04 |
파이썬 프로그램의 입력과 출력은 어떻게 해야 할까? (0) | 2022.03.02 |
댓글