2019년 6월 9일 일요일

파이썬에서 정규 표현식(정규식)으로 문자열 추출(import re) String regular expression in Python


정규식 사용하기 in Python regexp, http://www.regexr.com/ 사이트에서 미리 정규식을 테스트 해보는 실전 예제 : https://swlock.blogspot.com/2020/06/in-python.html


re

Python 파이썬에서 정규 표현식으로 문자열 추출할 수 있는 것은 re 모듈입니다.

용도

문자열에서 일정한 패턴의 문자열을 찾기 위해서 사용합니다.
많이 사용하기 때문에 많은 예제와 완벽하게 정리하였습니다.

re 모듈의 간단한 사용법

>>> import re
>>> p = re.compile('a.b')
>>> m = p.match('abb')
>>> print(m)
<re.Match object; span=(0, 3), match='abb'>
>>> 

특정 문자열 'abb' 에서 'a' 'b' 사이에 임의의 문자가 있는지 확인하는 함수 입니다.


정규표현식 사용하는 장소


re.compile('여기') 위치에 정규 표현식을 사용합니다.

정규표현식에 사용할 수 없는 특수 문자

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

1) [ ] : 문자 한개 의미

기본적으로 정규식에서 a는 [a] 와 동일함 abc는 [abc]가 아니고 [a][b][c]의미임
예)
[AaB] : a : 일치, B : 일치, b : 일치하지 않음, AB : A도 일치 하고, B도 일치함
[0-9] : 0~9 내의 숫자를 의미함, 0 : 일치, A : 일치 하지 않음

2) . : 임의의 문자/숫자 1개를 의미(단,\n(개행 문자)를 제외한 모든 문자와 매치)

예)
a.c 인 경우, abc : 일치, abb : 일치 하지 않음

3) * : 앞의 문자/숫자의 반복을 의미하며 한번도 반복이 안될 수 있음

예)
a*b 인 경우, ab : 일치, aab : 일치, aaab : 일치 , abc : 불일치
[ab]*b 인 경우, ab : 일치, b 일치 ( [ab]*에 의해 문자가 없을 수도 있음)

4) + : 앞의 문자/숫자의 반복을 의미하며 최소 한번의 반복이 있어야 함

예)
a+b 인 경우, ab : 불일치, aab : 일치, aaab : 일치 , abc : 불일치
[ab]+b 인 경우, ab : 일치, b 불일치 ( [ab]+에 의해 문자가 하나가 있어야 함)

5) {m,n} : 앞의 문자/숫자가 최소 m개 최대 n의 반복을 나타냄

예)
a{2,3} : a : 불일치, aa : 일치, aaa : 일치, aaaa : 불일치
{1}은 +와 동일하며 {0}은 *와 동일함

6) ? : {0, 1} 의미하며,  앞의 문자/숫자가 없거나 한개인 경우이다.

예)
a?b : a : 불일치, ab : 일치, b : 일치

7) ^ : NOT 을 의미한다. [ ] 내에서 사용한다.

예)
[^0-9] : 0 : 불일치, A : 일치

8) ^ : 문자열 시작을 의미

예)
^abc : abc 일치, babc 불일치 중간에 abc가 있지만 시작이 아니므로 일치 하지 않음, kkk abc : abc 단어가 있긴하지만 문자열의 처음이 아니므로 불일치

9) $ : 문자열의 마지막을 의미

예)
abc$ : kkkabc 는 일치 (search()메소드로 해야 함), re.compile('abc$').search('kkkabc')

10) ( ) : 문자를 묶는다

위의 대부분의 문법이 앞의 문자 1글자를 의미했는데 ( )를 이용하면 여러개의 문자로 대치 된다.
예)
(ab)* : a : 불일치, b : 불일치, ab : 일치, ababab : 일치

11) | : OR을 의미한다.  a|b 는 [ab] 와 같은 표현이다. 

ab|cd 는 [abcd]와 같은 표현은 아니다.
ab|cd 는 ([a][b])|([c][d]) 와 같다고 볼 수 있다.

12) \ : 정규식 표현식에 사용이 안되는 문자들의 표시할때 사용한다

.은 \. 으로 표시한다
\은 \\로 표시한다

자주 사용하는 문자열

\d - 숫자와 매치, [0-9]
\D - 숫자가 아닌 것과 매치, [^0-9]
\s - whitespace 문자와 매치, [ \t\n\r\f\v]와 동일한 표현식이다. 맨 앞의 빈 칸은 공백문자(space)를 의미한다.
\S - whitespace 문자가 아닌 것과 매치, [^ \t\n\r\f\v]
\w - 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9_]
\W - 문자+숫자(alphanumeric)가 아닌 문자와 매치, [^a-zA-Z0-9_].

4가지 메소드

match() 문자열의 0번째 위치부터 정규식과 매치되는지 조사, group() 이용 매치 되는 문자열 획득함
정규식이 a?c 인 경우 kabc 는 k가 있어서 일치하지 않음
아래 예제는 abc로 시작하는지 조사
>>> re.compile('^abc').match('abc')
<re.Match object; span=(0, 3), match='abc'>
>>> re.compile('^abc').match('abc').group()
'abc'

search() 문자열 전체를 검색하여 정규식과 매치되는지 조사한다.
정규식이 a?c 인 경우 kabc는 k를 건너뛰고 abc가 있어서 일치하는 부분 리턴
아래 예제는 마지막이 abc로 끝나는지 확인
>>> re.compile('abc$').search('kkkabc')
<re.Match object; span=(3, 6), match='abc'>
>>> re.compile('abc$').search('kkkabc').group()
'abc'

findall() 정규식과 매치되는 모든 문자열을 리스트로 리턴한다
>>> re.compile('a*c').findall('adbc adc ab ac adf adbdfajc')
['c', 'c', 'ac', 'c']

finditer() 정규식과 매치되는 모든 문자열을 iterator 객체로 리턴한다
>>> it = re.compile('a*c').findall('adbc adc ab ac adf adbdfajc')
>>> for r in it : print(r)

c
c
ac
c


정규식 사용하기 in Python regexp, http://www.regexr.com/ 사이트에서 미리 정규식을 테스트 해보는 실전 예제 : https://swlock.blogspot.com/2020/06/in-python.html


댓글 없음:

댓글 쓰기