본문 바로가기
Python/Python크롤링

파이썬 정규표현식

by hyun-am 2020. 9. 8.

정규표현식

 

정규 표현식이란

 

특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 정규 표현식은 많은 텍스트 편집기프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있으며, 특히 Tcl은 언어 자체에 강력한 정규 표현식을 구현하고 있다.

컴퓨터 과학의 정규 언어로부터 유래하였으나 구현체에 따라서 정규 언어보다 더 넓은 언어를 표현할 수 있는 경우도 있으며, 심지어 정규 표현식 자체의 문법도 여러 가지 존재하고 있다. 현재 많은 프로그래밍 언어, 텍스트 처리 프로그램, 고급 텍스트 편집기 등이 정규 표현식 기능을 제공한다.

출처 : https://ko.wikipedia.org/wiki/정규_표현식

 

정규 표현식 예시

먼저 아래와 같은 조건을 이용하여 정규표현식을 생성하겠습니다.

  1. 글자 a를 최소한 한 번 쓰시오
  1. 그 뒤에 b를 정확히 다섯개 쓰시오
  1. 그 뒤에 c를 짝수 번 쓰시오
  1. 마지막에 d가 있어도 되고 없어도 됩니다.

 

답 :

aa*bbbbb(cc)*(d| )
  • aa* : a를 한번쓴 후 a*를 썼습니다. 여기서 a*은 a가 0을 포함한 몇개든 상관 없다는 뜻입니다.
  • bbbbb : 특별한거 없습니다. 그냥 b 5개 입니다.
  • (cc)* : 0개의 쌍을 포함해서 짝수개를 출력해줍니다.
  • (d | ) : d가 오거나 ' '공백이 온다는 뜻입니다.

 

정규 표현식 예시(심화)

 

만약 크롤링한 데이터 중에서 이메일 주소만 따로 빼고 싶다면 다음과 같은 정규 표현식을 사용하면 됩니다.

[A-Za-z0-9\._+]+@[A-Za-z]+\.(com|org|edu|net)

 

  1. [A-Za-z0-9\._+]+ : A-z, a-z, 0-9중 하나를 뜻합니다. 이렇게 가능한 경우를 모두 대괄호([]) 안에 넣으면 '대괄호에 있는 것들 중 아무거나 하나'라는 뜻입니다. 그리고 \._+는 '.'과 '_'과 '_'를 쓸 수 있게 해주는 이스케이프 문자인 (\)를 사용합니다. 또한 마지막에 있는 +는 바로 앞에 있는 것이 최소한 한 번은 나타나야 하며 몇개인지는 상관 없다는 뜻입니다.
  1. @ : 매우 단순한 규칙으로 @ 를 포함한다는 뜻입니다.
  1. [A-Za-z]+ : 위에 있는것과는 다르게 A-Z, a-z만 포함합니다.
  1. \. : 도메인 이름 다음에는 반드시 .이 필요합니다 따라서 이스케이프 문자를 이용해서 표시합니다.
  1. (com|org|edu|net) : 마침표 다음에 나올 수 있는 문자들을 나열한 것입니다.

 

자주 쓰이는 정규 표현식 기호

기호 의미 예제 일치하는 문자열 예제
* 바로 앞에 있는 문자, 하위 표현식, 대괄호로 묶인 문자들이 0번 이상 나타납니다. a*b* aaaaaaaa,aaabbbb,bbbbb
+ 바로 앞에 있는 문자, 하위 표현식, 대괄호로 묶인 문자들이 1번 이상 나타납니다. a+b+ aaaaaab, ab, aaaabbbbbb
[] 대괄호 안에 있는 문자 중 하나가 나타납니다. [A-Z]* APPLE, CAPITALS, QWERTY
() 그룹으로 묶인 하위 표현식입니다. 정규 표현식을 평가할 때에는 하위 표현식이 가장 먼저 평가됩니다. (a*b)* aaabaaab, abaaab, ababaaaab
{m,n} 바로 앞에 있는 문자, 하위 표현식, 대괄호로 묶인 문자들이 m번이상, n번 이하 나타납니다. a{2,3}b{2,3} aabbb,aaabbb,aabb
[^] 대괄호 안에 있는 문자를 제외한 문자가 나타납니다. [^A-Z]* apple, capitals, qwerty
| |로 분리된 문자, 문자열, 하위 표현식 중 하나가 나타납니다. |는 '파이프'라 부르는 세로 막대이며 대문자 |가 아닙니다. b(a|i|e)d bad, bid, bed
. 문자 하나(글자, 숫자, 기호, 공백 등)가 나타납니다. b.d bad, bzd, b$d, b d
^ 바로 뒤에 있는 문자 혹은 하위 표현식이 문자열의 맨 앞에 나타납니다. ^a apple, asdf, a
\ 특수 문자를 원래 의미대로 쓰게 하는 이스케이프 문자입니다. \. \| \\ . | \
& 정규 표현식 마지막에 종종 쓰이며, 바로 앞에 있는 문자 또는 하위 표현식이 문자열의 마지막이라는 뜻입니다. 이 기호를 쓰지 않은 정규 표현식은 사실상 .*가 마지막에 있는 것이나 마찬가지여서 그 뒤에 무엇이 있든 전부 일치합니다. ^ 기호의 반대라고 생각해도 됩니다. [A-Z]*[a-z]*& ABCabc,zzzyx,Bob
? ! '포함하지 않는다'는 뜻입니다. 이 기호 쌍 바로 다음에 있는 문자(또는 하위 표현식)는 해당 위치에 나타나지 않습니다. 이 기호는 조금 혼란스러울 수 있습니다. 배제한 문자가 문자열의 다른 부분에도 나타 날 수 있기 때문입니다. ^((?![A-Z]).)*$ no-caps-here, $ymb0ls a4e f!ne

정규 표현식을 BeautifulSoup에 응용하기

 

먼저 아래와 같은 사이트(http://www.pythonscraping.com/pages/page3.html)에 들어가면 다양한 이미지가 있는 것을 확인할 수 있습니다. 저희는 여기서 .jpg형식으로 된 파일만 가져오겠습니다.

 

from urllib.request import urlopen
from bs4 import BeautifulSoup as bs
import re
 

html = urlopen("http://www.pythonscraping.com/pages/page3.html")
bsObj = bs(html,"html.parser")

images = bsObj.findAll("img",{"src":re.compile("\.\.\/img\/gifts\/img.*\.jpg")})
for image in images:
    print(image)

# 출력 값
# <img src="../img/gifts/img1.jpg"/>
# <img src="../img/gifts/img2.jpg"/>
# <img src="../img/gifts/img3.jpg"/>
# <img src="../img/gifts/img4.jpg"/>
# <img src="../img/gifts/img6.jpg"/>

 

댓글