상세 컨텐츠

본문 제목

정규 표현식 (Regular Expression) (python)

카테고리 없음

by koharin 2020. 7. 9. 15:52

본문

728x90
반응형

메타 문자(meta characters)

 

. ^ $ * + ? { } [ ] \ | ( )

 

- 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자

- 위는 정규 표현식에서 사용하는 메타 문자이다.

 

1. 문자 클래스 [ ]

 

- [ ] 사이의 문자들과 매치

 

[abc]

[abc]는 "a, b, c 중 하나의 문자와 매치"를 의미한다.

"a" : "a"가 정규식과 일치함. 매치

"before" : "b"가 정규식과 일치함. 매치

"dude" : 정규식과 일치하는 문자가 없음. 매치되지 않는다.

 

|

>>> print(re.search('Crow|Servo', 'CrowHello'))
<re.Match object; span=(0, 4), match='Crow'>

- A | B 정규 표현식은 A 또는 B라는 의미이다.

- or

 

^

>>> print(re.search('^Life', 'My Life'))
None
>>> print(re.search('^Life', 'Life Style'))
<re.Match object; span=(0, 4), match='Life'>

- 문자열의 맨 처음과 일치함.

- re.MULTILINE 컴파일 옵션 사용 시 각 줄의 처음과 일치

 

$

>>> print(re.search('Life$', 'My Life'))
<re.Match object; span=(3, 7), match='Life'>

- 문자열의 끝과 매치

- ^과 반대의 의미

 

\A

>>> data = """python one
life is too short
python two
you need python
python three"""
>>> print(re.search('\Apython', data))
<re.Match object; span=(0, 6), match='python'>

- 문자열의 처음과 매치된다.

- re.MULTILINE 옵션 사용 시 줄 상관없이 전체 문자열의 처음과 매치

(^과 이 부분에서 차이가 있다.)

 

\Z

>>> print(re.search('three\Z', data))
<re.Match object; span=(63, 68), match='three'>
>>> print(re.search('python\Z', data))
None

- 문자열의 끝과 매치된다.

- re.MULTILINE 컴파일 옵션 사용 시 $ 메타문자와 다르게 줄 상관없이 전체 문자열 줄 마지막에만 매치된다.

 

\b

>>> p = re.compile(r'\bclass\b')
>>> print(p.search('no class at all'))
<re.Match object; span=(3, 8), match='class'>

- 단어 구분자(Word boundary)로, whitespace에 의해 구분된다.

>>> print(p.search('the declassified algorithm'))
None

- 위의 경우, class 문자열이 있지만 whitespace로 구분되지 않아 매치되지 않는다.

- '\b'는 파이썬 리터럴 규칙에 의하면 backspace에 해당한다. 

따라서 raw string임을 알려주는 기호 r을 붙여야 한다.

 

\B

>>> p = re.compile(r'\Bclass\B')
>>> print(p.search('no class at all'))
None
>>> print(p.search('the declassified algorithm'))
<re.Match object; span=(6, 11), match='class'>
>>> print(p.search('one subclass is'))
None

- whitespace로 구분되는 단어가 아닌 경우에만 매치된다.

- 앞뒤에 whitespace가 하나라도 있으면 매치되지 않는다.

 

그루핑

 

( ) : 그룹을 만들어주는 메타문자

>>> p = re.compile('(ABC)+')
>>> m = p.search('ABCABCABC OK?')
>>> print(m)
<re.Match object; span=(0, 9), match='ABCABCABC'>
>>> p = re.compile(r"\w+\s+\d+[-]\d+[-]\d+")
>>> print(p.search("park 010-1234-1234"))
<re.Match object; span=(0, 18), match='park 010-1234-1234'>

- 그루핑을 사용하면 매치된 문자열에서 특정 문자열을 뽑아낼 수 있다.

 

만약 찾은 "park 010-1234-1234" 에서 이름만 뽑아내고 싶으면 (\w+)으로 정규식을 작성하면 된다.

>>> p = re.compile(r"(\w+)\s+\d+[-]\d+[-]\d+")
>>> print(p.search("lee 010-0516-0914").group(1))
lee

 

group(0) 매치된 전체 문자열
group(1) 첫 번째 그룹에 해당하는 문자열
group(2) 두 번째 그룹에 해당하는 문자열
group(n) n 번째 그룹에 해당하는 문자열

 

전화번로를 뽑아내고 싶으면 전화번호에 해당하는 정규식에 ()으로 그루핑을 하고 group(2)로 찾는다.

>>> p = re.compile(r"(\w+)\s(\d+[-]\d+[-]\d+)")
>>> print(p.search("park 010-1234-1234").group(2))
010-1234-1234

 

 

 

 

 

728x90
반응형