내 잡다한 노트
정규 표현식 본문
정규 표현식에는 메타 문자가 있다. 그것은 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는
문자를 의미한다.
문자 클래스 : [ ]
문자 클래스로 만들어진 정규식은 "[ ] 사이의 문자들과 매치" 라는 의미를 갖게 된다.
[abc]라면 이 표현식의 의미는 "a, b, c 중 한 개의 문자와 매치" 를 뜻한다.
두 문자 사이에 - 을 사용하면 두 문자 사이의 범위를 의미한다.
문자 클래스 안에 ^ 메타 문자를 사용할 경우 반대라는 의미를 갖는다.
예를 들어 [^0-9]라는 정규 표현식은 숫자가 아닌 문자만 매치된다.
자주 사용하는 정규 표현식은 별도의 표기법으로 표현할 수 있다. 다음을 기억해 두자.
- \d - 숫자와 매치, [0-9]와 동일한 표현식이다.
- \D - 숫자가 아닌 것과 매치, [^0-9]와 동일한 표현식이다.
- \s - whitespace 문자와 매치, [ \t\n\r\f\v]와 동일한 표현식이다. 맨 앞의 빈 칸은 공백문자(space)를 의미한다.
- \S - whitespace 문자가 아닌 것과 매치, [^ \t\n\r\f\v]와 동일한 표현식이다.
- \w - 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9_]와 동일한 표현식이다.
- \W - 문자+숫자(alphanumeric)가 아닌 문자와 매치, [^a-zA-Z0-9_]와 동일한 표현식이다.
Dot (.)
이 메타 문자는 줄바꿈 문자인 \n을 제외한 모든 문자와 매치됨을 의미한다.
a.b 라는 정규식은 a + 모든문자 + b 라는 의미를 갖는다.
a와 b 사이에 어떤 문자가 들어가도 모두 매치된다는 의미이다.
만약 문자 클래스 내에 . 메타 문자가 사용된다면 이건 문자 . 그대로를 의미한다.
반복 (*)
ca*t 라는 정규식에는 반복을 의미하는 * 메타 문자가 사용됐다. *은 바로 앞에 있는
문자 a가 0부터 무한대로 반복될 수 있다는 의미이다.
그래서 ct도 매치되고, caaat도 매치가 된다.
반복 (+)
반복을 나타내는 또 다른 메타문자로 +가 있다. +는 최소 1번 이상은 반복될 때 사용한다.
그래서 ca+t일때 ct는 매치가 안된다.
반복 ({m, n}, ?)
{ } 메타 문자를 사용하면 반복 횟수를 고정할 수 있다. {m ,n}이라면 반복 횟수가 m부터 n까지
매치할 수 있다. 또한 생략할 수도 있는데 만약 {3, }처럼 사용하면 반복 횟수가 3 이상인 경우를
뜻한다.
{3} 3번만 반복되는 경우를 뜻함.
?
반복은 아니지만 비슷한 개념으로 ? 이 있는데 이 메타문자가 의미하는 것은 {0, 1} 이다.
ab?c 라면 abc나 ac가 매칭될 수 있다.
|
or과 동일한 의미로 사용된다. A|B라는 정규식이 있다면 A 또는 B라는 의미가 된다.
^
문자열의 맨 처음과 일치함을 의미한다.
^Life < -- > My Life
이면 맨 처음에 Life가 없어서 매치되지 않는다.
$
^ 메타 문자와 반대로 문자열의 끝과 매치함을 의미한다.
short$ < -- > Life is too short
이 경우 맨 끝에 short가 있으므로 매치가 성공한다.
^ 또는 $ 문자를 메타 문자가 아닌 문자 그 자체로 매치하고 싶다면 \^ , \$ 로 사용한다.
\b
단어 구분자이다. 보통 단어는 whitespace에 의해 구분된다.
\bclass\b < -- > no class at all
앞뒤가 whitespace인 class라는 단어와 매치된다.
주의해야 할 점이 있다. \b는 파이썬 리터럴 규칙에 의하면 백스페이스를 의미하므로
단어 구분자임을 알려주기 위해 r'\bclass\b'처럼 Raw string 임을 알려주는 기호 r을 반드시
붙여 줘야 한다.
\B
\b 메타 문자와 반대의 경우이다. 보통 대문자이면 소문자의 반대의 경우이다.
그루핑
ABC 문자열이 계속해서 반복하는지 조사하는 정규식을 작성하고 싶다면
( ) 메타 문자로 묶어서 반복하는지를 살필수 있다.
(ABC)+ < -- > ABCABCABC OK?
매칭이 된다.
"\w+\s+\d+[-]\d+[-]\d+" 은 이름 + " " + 전화번호 형태의 문자열을 찾는 정규식이다.
그런데 이중에서 이름만 뽑고 싶다면 어떻게 해야 할까?
보통 반복되는 문자열을 찾을 때 그룹을 사용하기도 하지만 특정 부분의 문자열만 뽑아내기
위해서도 있다.
r "(\w+)"를 감싸주고 match 객체의 group 메서드를 사용해
그룹핑된 부분의 문자열만 뽑아낼 수 있다.
group(0) : 매치된 전체 문자열
group(1) : 첫번째 그룹에 해당하는 문자열
그루핑된 문자열 재참조하기
재참조 메타 문자인 \1을 통해 정규식의 그룹 중 첫 번째 그룹을 가리킬 수 있다.
그룹에 이름을 지정하기
(\w+) 라는 그룹이 있다면 (?P<name>\w+) 로 작성해서 name 이라는 이름을 그룹에 붙인다.
참조를 하려면 group("name")으로 name이라는 그룹 이름을 참조할 수 있다.
그룹 이름으로 재참조를 할 수도 있다.
r'(?P<word>\b\w+)\s+(?P=word)'
(?P=word)를 통해 재참조를 할 수 있다.
전방 탐색
전방 탐색에는 긍정과 부정의 2종류가 있고 다음과 같이 표현한다
긍정형 전방 탐색 ((?=...)) : ...에 해당되는 정규식과 매치되어야 하며 조건이 통과되어도
문자열이 소비되지 않는다.
부정형 전방 탐색 ((?!...)) : ...에 해당되는 정규식과 매치되지 않아야 하며 조건이
통과되어도 문자열이 소비되지 않는다.
파이썬에서는 re 모듈을 통해 정규식을 사용함.
re.compile()을 통해 정규표현식을 쓸 수 있게끔 만들어주고
match(), search(), findall(), finditer()로 문자열 검색을 수행한다.
컴파일된 패턴 객체에 4가지 메서드가 존재한다.
match() : 문자열의 처음부터 정규식과 매치되는지 조사한다.
search() : 문자열 전체를 검색하여 정규식과 매치되는지 조사.
findall() : 정규식과 매치되는 모든 문자열을 리스트로 돌려줌
finditer() : 정규식과 매치되는 모든 문자열을 반복 가능한 객체로 돌려줌.
match 메서드와 search 메서드를 수행하면 match 객체를 돌려준다.
match 객체의 메서드들에도 여러가지가 존재한다.
group() : 매치된 문자열을 돌려준다.
start() : 매치된 문자열의 시작 위치를 돌려준다.
end() : 매치된 문자열의 끝 위치를 돌려준다.
span() : 매치된 문자열의 (시작, 끝)에 해당하는 튜플을 돌려준다.
'피드백' 카테고리의 다른 글
깔끔한 코드 짜는 10가지 규칙 (0) | 2023.11.18 |
---|