[정규표현식] 정규표현식 활용하기
대량의 텍스트로 이루어진 데이터를 다루어야 할 경우가 있다.
이럴 때 정규표현식을 이용하면 시간을 절약하고 오류를 줄일 수 있다.
스크립트, 정규표현식을 공부해 놓으면 대량의 텍스트 데이터를 처리할 때 큰 도움이 된다.
- 반복 찾기
- 위치 찾기
- 하위 표현식 사용하기
- 역참조 사용하기
- 전방탐색과 후방탐색
- 문법
반복 찾기
수량자의 문법을 참고하자
*?
, +?
, {n,}?
과 같이 lazy한 수량자를 이용하여 원하는 결과를 찾는게 중요하다.
*
, +
, {n}
과 같은 수량자는 기본적으로 greedy하다.
greedy한 수량자는 텍스트를 뒤에서부터 조회하여 가능한 큰 덩어리를 찾아준다.
<[Bb]>.*</[Bb]>
-<B>AK</B> and <B>HI</B>
<[Bb]>.*?</[Bb]>
-<B>AK</B>
,<B>HI</B>
위치 찾기
위치 지정, 변경자의 문법을 참고하자
(?m)
을 지원하지 않는 정규 표현식 구현이 많다.
(?m)
을 이용하면 각 라인별로 구분하여 ^
, $
가 동작하지만 \A
, \Z
는 정상적으로 동작하지 않는다.
하위 표현식 사용하기
하위 표현식은 ()
를 이용한다.
IPv4주소를 조회하기 위한 정규표현식을 참고하라
(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.)(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.)((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.)(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))
앞에 3개 중복되는 표현식을 하위표현식으로 묶어서 다음과 같이 변경할 수 있다.
(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))
역참조 사용하기
역참조와 전후방탐색, 대소문자 변환의 문법을 참고하자
역참조는 참조하는 표현식이 하위 표현식일 때 동작한다.
<h>
태그로 묶여있는 부분을 찾기 위한 정규표현식을 참고하라
<[hH]([1-6])>/*?</[hH]\1>
\1
은 ([1-6])
부분을 역참조하여 해당 태그를 닫아준다.
정규표현식 구현에 따라 역참조 방법이 다르다. 해당하는 문법을 확인하여 사용하자.
<h1>
태그로 감싸인 텍스트를 대문자로 변환하여보자
정규표현식: (<[Hh]1>)(.*?)(</[Hh]1>)
치환: $1\U$2\E$3
$1: (<[Hh]1>)
, $2: (.*?)
, $3: (</[Hh]1>)
을 의미한다.
전방탐색과 후방탐색
역참조와 전후방탐색의 문법을 참고하자
전후방 탐색을 이용하면 $150, $130, 23, 25과 같은 텍스트에서 특정 텍스트 주변의 텍스트를 조회할 수 있다.
정규표현식: (?<=\$)[0-9.]+
문법
기본 메타 문자
.
모든 문자와 일치
|
왼쪽 혹은 오른쪽과 일치
[]
문자 집합 구성원 중 하나와 일치
[^]
문자 집합 구성원을 제외하고 일치
-
범위 정의([A-Z]와 같은 형태)
\
다음에 오는 문자를 이스케이프
수량자
*
문자가 없는 경우나 하나 이상 연속하는 문자 찾기
*?
게으른 * 문자
+
문자 하나 이상 찾기
+?
게으른 + 문자
?
문자가 없거나 하나인 문자 찾기
{n}
정화히 요소와 n번 일치
{m,n}
요소와 m번에서 n번 일치
{n,}
요소와 n번 이상 일치
{n,}?
게으른 {n,}
위치 지정
^
문자열의 시작과 일치
\A
문자열의 시작과 일치
$
문자열의 끝과 일치
\Z
문자열의 끝과 일치
\<
단어의 시작과 일치
\>
단어의 끝과 일치
\b
단어 경계와 일치
\B
\b와 반대로 일치
특수한 문자
[\b]
역스페이스
\c
제어문자와 일치
\d
모든 숫자와 일치
\D
\d와 반대
\f
페이지 넘기기(form feed)
\n
줄바꿈
\r
캐리지 리턴
\s
공백 문자와 일치
\S
\s와 반대로 일치
\t
탭
\v
수집 탭
\w
영숫자 문자나 밑줄과 일치
\W
\w와 반대로 일치
\x
16진수 숫자와 일치
\0
8진수 숫자와 일치
역참조와 전후방탐색
()
하위 표현식 정의
\1
첫 번째 일치한 하위 표현식. 두번째 일치한 하위 표현식은 \2로 표기하는 방식
?=
전방탐색
?<=
후방탐색
?!
부정형 전방탐색
?<!
부정형 후방탐색
?<backreference>true
조건 지정
?<backreference>true|false
else 표현식 조건 지정
대소문자 변환
\E
\L 혹은 \U 변환을 끝냄
\l
다음에 오는 글자를 소문자로 변환
\L
\E를 만날 때까지 모든 문자를 소문자로 변환
\u
다음에 오는 글자를 대문자로 변환
\U
\E를 만날 때까지 모든 문자를 대문자로 변환
변경자
(?m)
다중행 모드
출처: 벤 포터, "손에 잡히는 정규 표현식", 김경수 옮김, 인사이트, 2010