Python/데이터 분석

데이터 분석 텍스트 마이닝 정규표현식 python [2편]

dev-u 2024. 2. 6. 09:05

데이터 분석 텍스트 마이닝 정규표현식 2편 함수

  1. match()
  • 문자열 처음부터 정규식의 매칭 조사
p = re.compile('[0-9]+') res = p.match('abcd1415')

 

시작부터 정규식에 매칭되지 않았기에 None

2. search()

  • 문자열의 전체와 정규식의 매칭 조사
  • res = p.search( 'abcd5 5skdn 1234 sdfjw434' ) 
    print(res)
 

5

3. findall()

  • 정규식에 매칭되는 모든 문자열을 list로 리턴
p = re.compile('[a-z]+') 
res = p.findall( 'abcd5 5obnd 1234 sdfjw434 12abc34 ad12fh' ) 
if res: print( res )

문자열에서 소문자로만 이어진 문자열을 다 찾아서 리스트로 리턴한다

['abcd', 'obnd', 'sdfjw', 'abc', 'ad', 'fh']

4. finditer()

  • 정규식에 매칭되는 모든 문자열을 iterator 리턴
 
res = p.finditer( 'abcd5 5obnd 1234 sdfjw434 12abc34 ad12fh' ) 
for w in res: 
	print( w, w.group(), w.start(), w.end(), w.span() )

검색된 부분이 문자열내에 어떤 위치에 있는지도 리턴한다

ex) <re.Match object; spang=(0,4), match='abcd'> abcd 0 4 (0, 4)

5. sub()

  • 정규식에 매칭되는 부분을 특정 문자열로 대체
 
p = re.compile('(red|blue|white)') 
p.sub('컬러', '내가 좋아하는 색은 red, 너가 좋아하는건 blue, white는 모두가')

정규식에 매칭되는 부분을 컬러 문자열로 대체한다

'내가 좋아하는 색은 컬러, 너가 좋아하는건 컬러, 컬러는 모두가'

6. group()

  • 데이터를 그룹화하여 추출 가능
 
text = 'SKT 010-1234-5678 홍길동' 
p = re.compile(r'(\w+)\s+((\d+)[-](\d+)[-](\d+))\s+(\w+)') 
m = p.search(text) 
for n in m.groups(): 
	print( n )

SKT

010-1234-5678

010

1234

5678

홍길동

7. compile()

7-1 DOTALL, S

p = re.compile( 'a.b', re.DOTALL ) 
print( p.match('a|b') ) 
print( p.match('a\nb') )

첫번째는 원래 출력되는 코드이며 두번째는 DOTALL이 없을때는 줄바꿈으로 None이 출력되지만 DOTALL을 통해 줄바꿈도 처리된다

re.DOTALL 은 re.S로 작성해도 된다

7-2 IGNOGRECASE, I

  • 대소문자 구분없이 매칭
 
p = re.compile( '[a-z]', re.I ) 
print( p.match('python').group() ) 
print( p.match('Python').group() )

p, P 가 출력되며 대소문자 구분없이 매칭된다

7-3 MULTILINE, M

  • 여러 문장을 탐색하면서 매칭

7-4 VERBOSE, X

  • 복잡한 정규식을 설명할때 사용
 

 

p = re.compile( r''' ( # 그룹핑 시작 
0[0-7]+ # 8진수 | 
[0-9]+ # 10진수 | 
x[0-9a-fA-F]+ # 16진수 
) # 그룹핑 끝 ; # 문자1개 ''', re.X)

8. 전방탐색

text = 'https://m.naver.com' 
p = re.compile('.+:') 
m = p.search( text ) 
if m: 
	print( m.group() )

https: 예시처럼 url을 취득할때 사용할 수 있다

8-1. 긍정형 전방탐색

text = 'https://m.naver.com' 
p = re.compile('.+:') 
m = p.search( text ) 
if m: 
	print( m.group() )

긍정형 전방탐색으로 예시와 같이 정규식에 해당하는 값을 받아올때 사용한다

8-2 부정형 전방탐색

p = re.compile('.*[.](?!py$|msi$).*$')

 

위 코드는 부정형 전방탐색의 예시로 파일들 중에서 확장자가 py, msi로 끝나는 파일을 제외한다 처럼 파일 확장자 제외와 같은 상황에 사용한다

9. 주민번호 필터링

p = re.compile( '(\d{6})[-]\d{7,7}' ) 
data = ''' A 741007-1234567 B 020115-3234567 ''' 

print( p.sub( '\g<1>-*******', data) ) 
---- 
p = re.compile( '(\d{6})[-](\d)\d{6}' ) 

print( p.sub( '\g<1>-\g<2>******', data) )

첫번째 print는 뒷자리 모두 *표시로 처리하는 코드이고

두번째 print는 뒷자리 첫번째숫자만 표시되도록 만든 코드이다

data라는 텍스트에 컴파일 형식에 따라 출력하는 방식을 설정하는 방식이다