상세 컨텐츠

본문 제목

10. 정규 표현식 - 3

데이터 분석/웹 스크래핑

by 알파고제로 2023. 10. 30. 09:27

본문

■ 파이썬에서 정규 표현식 사용

  • re 모듈 사용
    • re 모듈의 compile 함수를 이용하여 정규 표현식을 컴파일 한다.
import re
p = re.compile('ab*')
  • 정규식을 사용한 문자열 검색
    • 컴파일 된 객체를 이용하여 다음의 함수를 이용하여 문자열 검색을 할 수 있다.
함수 설명
match() 문자열의 처음 시작부터 검색하여 일치하지 않는 부분이 나올 때까지 찾는다.
search() 문자열 전체를 검색하여 처음으로 매치되는 문자열을 찾는다.
findall() 정규식과 매치되는 모든 문자열을 찾아 리스트로 반환한다.
finditer() 정규식과 매치되는 모든 문자열을 반복 가능한 객체로 반환한다.
# 컴파일과 매치의 동시 수행
m = re.match('[a-z]+', 'python')

 

  • Match 객체 함수
함수 설명
group() 매치된 문자열을 반환한다.
start() 매치된 문자열의 시작 위치를 반환한다.
end() 매치된 문자열의 끝 위치를 반환한다.
span() 매치된 문자열의 시작과 끝 값을 튜플로 반환한다.

 

  • 컴파일 옵션
옵션 약어 설명
DOTALL S dot(.) 메타 문자가 줄바꿈 문자(‘\n’)를 포함하여 모든 문자와 일치한다.
IGNORECASE I 대소문자에 관계 없이 일치한다.
MULTILINE M 여러 줄의 문자열에 대해 ^, $ 메타문자를 적용할 수 있다.
※ ^는 문자열의 처음을, $는 문자열의 마지막을 의미
VERBOSE X 정규식을 보기 편하게 만들고 주석 등을 사용할 수 있게 한다.

 

  • 백슬래시
[가정] “\section” 문자열을 찾기 위한 정규식을 만들어야 하는 상황
re.compile(“\section”) 이 정규식은 \s 문자가 공백으로 해석되어 의도한 대로 매치가 이뤄지지 않음
왼쪽의 정규식은 [ \t\n\r\f\v]ection 과 같은 의미로 해석 됨
결국 정규식에서 사용한 \ 문자가 문자열 자체임을 알려 주기 위해 \2개 사용하여 이스케이프 처리를 해야 한다.
>>> re.compile(“\\section”)
하지만 파이썬 정규식 엔진에는 파이썬 문자열 리터럴 규칙에 따라 \\\로 변경되어 결국 \section이 전달된다.
결국 파이썬 정규식 엔진에 \\ 문자를 전달하기 위해서는 백슬래시 4\\\\를 사용해야 한다.

이러한 문제로 인해 파이썬 정규식에는 Raw String 규칙이 생기게 됐다.
따라서 다음과 같이 정규식 문자열 앞에 r 문자를 삽입하면 Raw String 규칙에 의해 \를 1개만 써도 동일한 의미를 갖게 된다.  >>> re.compile(r”\\section”)

 

  • 메타 문자
메타 문자 설명
| or의 의미
^ 문자열의 처음과 일치함을 의미
$ 문자열의 끝과 일치함을 의미
\A 문자열의 처음과 일치함을 의미. ^MULTILINE 옵션을 사용할 경우 각 줄의 문자열의 처음과 매치되지만 \A줄과 상관 없이 전체 문자열의 처음 하고만 일치 된다.
\Z 문자열의 끝과 일치함을 의미. 여러 줄로 작성된 문자열에서 줄과 상관 없이 전체 문자열의 끝과 일치된다.
\b 단어 경계를 나타낸다. 단어 경계는 단어 문자와 비단어 문자 사이의 위치를 의미한다. 여기서 단어 문자는 보통 알파벳, 숫자, 밑줄 문자를 포함하며, 비단어 문자는 그 외의 문자이다.
\b는 백스페이스를 의미하므로 단어 구분자로 사용되기 위해서는 Raw string임을 알려주는 r을 반드시 붙여줘야 한다.
\B \b와 반대로 단어 앞뒤가 공백으로 구분된 단어가 아닌 경우에만 일치된다.

 

  • 그룹핑
    • () 메타 문자는 그룹을 만든다.
    • 그룹을 만들면 group() 함수를 사용하여 그룹핑된 부분의 문자열만 뽑아낼 수 있다.
group(인덱스) 설명
group(0) 일치된 전체 문자열, group()와 동일
group(1) 첫 번째 그룹에 해당하는 문자열
group(n) n 번째 그룹에 해당하는 문자열
  • ‘\번호’를 이용하면 번호에 해당하는 그룹을 재참조 한다. 표현식은 Raw String으로 선언해야 한다.
  • 그룹핑에 이름 붙이기:  (?P<그룹 이름>)

 

  • 전방 탐색
정규식 종류 설명
표현식1(?=표현식2) 긍정 전방 탐색 표현식1 뒤의 문자열이 표현식2와 매치되면 표현식1 일치. 표현식2의 문자열은 결과로 반환하지 않는다.
표현식1(?!표현식2) 부정 전방 탐색 표현식1 뒤의 문자열이 표현식2와 매치되지 않으면 표현식1 일치. 표현식2의 문자열은 결과로 반환하지 않는다.

 

  • 후방 탐색
    • 텍스트를 반환하기 전에 뒤쪽을 탐색하는 것
정규식 종류 설명
(?<=표현식2) 표현식1 긍정 후방 탐색 표현식1 앞의 문자열이 표현식2와 매치되면 표현식1 일치. 표현식2의 문자열은 결과로 반환하지 않는다.
(?<!표현식2) 표현식1 부정 전방 탐색 표현식1 앞의 문자열이 표현식2와 매치되지 않으면 표현식1 일치. 표현식2의 문자열은 결과로 반환하지 않는다.

 

  • 문자열 바꾸기
# Pattern 객체.sub(바꿀 문자열, 대상 문자열, 바꿀 횟수)

p = re.compile('(blue|white|red)')
p.sub('colour' , 'blue socks and red shoes', count=1)

'데이터 분석 > 웹 스크래핑' 카테고리의 다른 글

11. BeautifulSoup 모듈  (0) 2023.10.31
09. 정규 표현식 - 2  (0) 2023.10.27
08. 정규 표현식 - 1  (0) 2023.10.26

관련글 더보기

댓글 영역