나의 잡다한 노트 및 메모

정규표현식 (regex) 본문

크롤링

정규표현식 (regex)

peanutwalnut 2022. 5. 30. 20:54

# 정규표현식

일정한 패턴을 가진 문자열의 집합을 표현하기 위해 사용하는 형식 언어이다.

 

# 역할

정규 표현식은 문자열을 대상으로 패턴 매칭 기능을 제공한다.

패턴 매칭 기능이란 특정 패턴과 일치하는 문자열을 검색, 추출, 치환할 수 있는 기능을 말한다.

즉, 반복문과 조건문 없이 패턴을 가진 문자열을 간단하게 검색, 추출, 치환할 수 있다.

즉,  문자열 검색, 추출, 대체 의 역할을 수행한다.

 

# 파이썬에서의 사용

1. 정규표현식 모듈 불러오기

import re           re를 임포트해준다.

 

2. 정규표현식 패턴 생성하기

pattern = re.compile('패턴')

 

3. 패턴으로 문자열을 검색

3-1. 문자열의 처음부터 일치하는지 확인

    pattern.match('문자열')

3-2. 문자열의 전체의 일부 일치하는지 확인

    pattern.search('문자열')

3-3. 문자열의 전체에서 일치하는지 확인 후 모두를 배열화

    pattern.findall('문자열')

 

 

[0-9] : 숫자를 찾음

[^0-9] : 숫자가 아닌 것을 찾음

[\t\n\r\f\v] : white space(스페이스, 탭, 엔터 등) 문자인 것을 찾음

[^\t\n\r\f\v] : white space 문자가 아닌 것을 찾는다.

[A-Za-z] : 문자를 찾음

[^A-Za-z] : 문자가 아닌 것을 찾음

즉, ^는 not의 의미를 가지고 있다.

 

예: 문자 숫자가 아닌 데이터를 찾아서, ''로 대체해라 삭제해라

import re

string = '(Dave)'

re.sub('[^A-Za-z0-9]', '', string)

-> 'Dave'

 

1. Dot .

Dot . 메타 문자는 줄바꿈 문자인 \n을 제외한 모든 문자(한 개)를 의미함

예: D.A는 D + 모든 문자 한 개 + A를 의미

-> DAA, DvA, D1A

 

정규 표현식 패턴 만들기

pattern = re.compile('D.A')

 

패턴에 매칭되는지 여부 화인하기

pattern.search('DAA')

-> 쏼라쏼라 머라고 뜸

만약 맞는 패턴이 매칭되지 않는다면 아무것도 뜨지 않는다.

 

2. 반복 ?, *, +

?는 앞 문자가 0번 또는 1번 표시되는 패턴

*는 앞 문자가 0번 또는 그 이상 반복되는 패턴

+는 앞 문자가 1번 또는 그 이상 반복되는 패턴

 

pattern = re.compile('D?A')

pattern.search('A')

-> 매칭됨. 왜? D가 0번 나왔기 때문에

pattern.search('DDA')

-> 매칭됨 왜? D가 1번 나왔기 때문에

DDA에서 D'DA'를 매칭해서 찾았다고 말함.

 

또다른 반복 표현 : {n}, {m, n}

{n} : 앞 문자가 n번 반복되는 패턴

{m, n} : 앞 문자가 m번 반복되는 패턴부터 n번 반복되는 패턴까지

 

3. [ ] 괄호 : 괄호 안에 들어가는 문자가 들어 있는 패턴

예: [abc]는 a, b, c 중 하나가 들어 있는 패턴을 말함

 

하이폰(-)을 이용하면 알파벳 전체를 나타낼 수 있음

예: [a-c]는 a,b, c 중 하나가 들어 있는 패턴을 말함

 

[ ] 괄호 안에서 [ 바로 뒤에 ^을 쓰면 그 뒤에 오는 문자가 아닌 패턴을 찾음

그러면 한글만 추출하고자 한다면

[가-힣] 이렇게 하면 된다.

 

# re 모듈의 함수

search 함수는 문자열 전체를 검색해 패턴이 매칭되는지 여부를 확인하는 함수

sub 함수는 패턴에 맞는 걸 찾아 바꾸거나 삭제하는 함수이다.

compile 함수는 패턴을 만드는 함수

match : 문자열 처음부터 정규식과 매칭되는 패턴을 찾아서 리턴하는 함수

findall : 정규표현식과 매칭되는 모든 문자열을 리스트 객체로 리턴하는 함수

 

search VS match

import re

pattern = re.compile('[a-z]+')

matched = pattern.match('Dave')

searched = pattern.search('Dave')

print(matched)

-> None

print(searched)

-> 'ave'가 매칭됐다고 나온다.

 

차이가 생기는 이유는 matched는 문자열 처음부터 찾기 때문에 문자열 처음인

D를 만나 패턴이 맞지 않아 None을 출력하게 되는 거고 

searched는 문자열 전체를 검색하기 때문에 문자열 처음이 D인걸 신경안쓴다.

 

 

findall 활용

pattern = re.compile('[A-Za-z]+')

a = pattern.findall('GANA DARA MABA SA')

-> ['GANA', 'DARA', 'MABA', 'SA']

 

 

 

 

 

 

 

'크롤링' 카테고리의 다른 글

크롤링해서 엑셀 파일로 만들기  (0) 2022.05.31
데이터 포맷(XML, JSON, CSV)  (0) 2022.05.30
파이썬 문자열 함수 정리  (0) 2022.05.30
html parser 크롤링 예제코드와 이론  (0) 2022.05.28