본문 바로가기
Python/크롤링&스크래핑

[웹스크래핑] 정규식(Regular Expression)

by 리미와감자 2023. 1. 15.

정규식(Regular Expression)

특정 단어나 패턴을 표현하는 축약된 형식으로, 규칙이 있는 문자열을 비교, 추출할때 사용한다.

크롤링이나 스크래핑 시에 필요한 정보를 가져올때 유용하게 사용한다.

 

예를 들어,

 

주민등록번호 : 95xxxx-xxxxxxx

이메일 주소 : tistory@gmail.com

차량 번호 : 123가 1234

IP 주소 : 192-111.0.1

 

등이 있다.


1. 정규식 형태를 가진 문자열을 정규식 객체로 컴파일한다.

 

import re

p = re.compile("ca.e")

 

위의 코드는 ca?e와 관련된 문자열을 찾기위한 첫 시작이다. 즉, 정규식을 정의하는 단계이다.

ca?e는 care, case, cafe, cave 등이 될 수 있다.

 

정규식

. : (ca.e) : 하나의 문자를 의미 > care, cafe, case (O) | caffe (X)
^ : (^de) : 문자열의 시작 > desk, destination (O) | fade (X)
$ : (se$) : 문자열의 끝 > case, base (O) | face (X)
* : 앞의 문자가 0번 혹은 여러 번 반복될 수 있음
*? : 앞의 문자가 0번 혹은 여러 번 반복될 수 있음을 의미(비탐욕)
+ : 앞의 문자가 1번 이상 나타남을 의미
+ : 앞의 문자가 1번 이상 나타남을 의미(비탐욕)

 

 

2. 주어진 문자열이 일치하는지 확인

 

m = p.match("caseless") # match : 주어진 문자열의 처음부터 일치하는지 확인

p.match()는 찾고자하는 문자열이 반드시 가장 앞에 와야한다. 'caseless'인 경우 case를 찾을 수 있지만

good care'인 경우 찾지 못한다.

 

m = p.search("good care cafe") # search : 주어진 문자열 중에 일치하는 게 있는지 확인

p.search()는 주어진 문자열을 모두 스캔하여 일치하는지 확인한다. p.match()와 달리 care를 찾아낼 수 있으며, 문자열 하나만을 찾기때문에 cafe는 찾지 못한다.

 

lst = p.findall("good care cafe") # findall : 일치하는 모든 문자열을 리스트 형태로 반환

p.findall()은 주어진 문자열에서 일치하는 모든 문자열은 찾아서 리스트로 반환한다. care와 cafe를 모두 찾을 수 있다.

['care', 'cafe']

 

 

3. 결과 반환

print("m.group():", m.group()) # 일치하는 문자열 반환
print("m.string:", m.string) # 입력받은 문자열 반환
print("m.start():", m.start()) # 일치하는 문자열의 시작 index
print("m.end():", m.end()) # 일치하는 문자열의 끝 index
print("m.span():", m.span()) # 일치하는 문자열의 시작 / 끝 index

전체 코드

import re

p = re.compile("ca.e")

def print_match(m):
    if m:
        print("m.group():", m.group()) # 일치하는 문자열 반환
        print("m.string:", m.string) # 입력받은 문자열 반환
        print("m.start():", m.start()) # 일치하는 문자열의 시작 index
        print("m.end():", m.end()) # 일치하는 문자열의 끝 index
        print("m.span():", m.span()) # 일치하는 문자열의 시작 / 끝 index
    else:
        print("매칭되지 않음") # 매칭되지 않으면 에러 발생

# m = p.match("caseless") # match : 주어진 문자열의 처음부터 일치하는지 확인
# print_match(m)

m = p.search("good care cafe") # search : 주어진 문자열 중에 일치하는 게 있는지 확인
print_match(m)

# lst = p.findall("good care cafe") # findall : 일치하는 모든 문자열을 리스트 형태로 반환
# print(lst)


# 1. p = re.compile("원하는 형태")
# 2. m = p.match("비교할 문자열") # match : 주어진 문자열의 처음부터 일치하는지 확인
# 3. m = p.search("비교할 문자열") # search : 주어진 문자열 중에 일치하는 게 있는지 확인
# 4. lst = p.findall("비교할 문자열") # findall : 일치하는 모든 문자열을 리스트 형태로 반환

# 원하는 형태 : 정규식
# . : (ca.e) : 하나의 문자를 의미 > care, cafe, case (O) | caffe (X)
# ^ : (^de) : 문자열의 시작 > desk, destination (O) | fade (X)
# $ : (se$) : 문자열의 끝 > case, base (O) | face (X)

 

 

학습에 도움되는 사이트

https://www.w3schools.com/python/python_regex.asp

 

Python RegEx

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

https://docs.python.org/ko/3/library/re.html

 

re — Regular expression operations

Source code: Lib/re/ This module provides regular expression matching operations similar to those found in Perl. Both patterns and strings to be searched can be Unicode strings ( str) as well as 8-...

docs.python.org

 

댓글