https://gibles-deepmind.tistory.com/88
지난 시간에는 메타 문자에 대해서 다루어 봤습니다. 이번 시간에는 문자의 반복에 대해서 다루어 보겠습니다.
0. 들어가며
1. 반복 메타 문자: +와 *의 차이
2. 반복 메타 문자는 탐욕적이다?
2-1. 의미적인 관점에서
2-2. 정규표현식 관점에서
3. 반복 메타 문자의 활용
3-1. 문법적인 측면에서
3-2. 조건으로 활용
4. 반복을 하고 싶지 않다면?
0. 들어가며
A 910111
B 910112
C 910113
D 910114
여기서 숫자 여섯자리만 인식하려면 어떻게 해야할까요?
\d를 여섯번 사용하면 숫자 여섯자리를 인식할 수 있는데요. 문법이 깔끔하지가 않습니다. 또한, 6자리가 아닌 경우에는 인식할 수가 없습니다. 이때, 사용할 수 있는 것이 반복 메타 문자입니다.
1. 반복 메타 문자: +와 *의 차이
반복 메타 문자에는 +와 *이 있습니다.
최근에 드라마 DP가 유행했죠? 드라마 DP를 보다보면 한호열이 안준호에게 "내 아들"이라고 부르는 장면이 나옵니다. 통상적으로 군대에서는 1년 가량 차이나는 군번을 아들 군번이라고 합니다. 갑자기 옛날 생각나네요.. 이번 시간에는 군번 찾기로 반복 메타 문자에 대해서 설명해보겠습니다(???).
중대장 : 너 군번이 뭐야?
신병 : 잘못들었습니다?
중대장 : 아니 군번이 뭐냐고
신병 : ......
중대장 : 너 군번은 19-00000000 이야. 앞으로는 까먹지마렴. 초코파이 가지고 생활관으로 돌아가
신병 : 넵 알겠습니다!
자세히 생각해보면 참 소름돋는 대화입니다. 예시로 들은거니 그냥 넘어가주세요..
\d+-\d+
위와 같이 +를 사용하면 쉽게 군번을 찾을 수 있습니다. \d+-\d+를 자세히 뜯어보겠습니다. 해당 정규표현식은 크게 3가지 파트로 나누어져 있는데요.
다른 글에서 escape와 메타 문자 하이픈(-)에 대해서 설명을 했었습니다. 메타 문자를 일반적으로 사용할 때는 앞에 \를 붙입니다. 하지만, 메타 문자 하이픈(-)은 [] 대괄호 안에서 사용되는 메타 문자이기 때문에 그냥 -로 사용해도 무방합니다. 다시 돌아가 위 정규표현식은 아래와 같이 해석할 수 있습니다.
1.\d+ : 하이픈 전까지 나오는 모든 숫자들을 찾아라
2.- : 하이픈을 찾아라
3.\d+ : 하이픈 이후 나오는 모든 숫자들을 찾아라
+ : 앞에 위치한 문자를 한번 이상 반복
*를 사용하면 다른 결과를 확인할 수 있는데요.
이번에는 19-00000000 뿐만 아니라, 19-.... 까지 인식한 것을 알 수 있습니다. 왜냐하면, *는 +와 달리 문자가 인식되지 않은 경우도 포함하기 때문입니다. 즉, 19- 뒤에 \d가 0번 즉, 숫자가 한번도 나오지 않는 경우도 포함한다는 의미입니다.
* : 앞에 위치한 문자를 0번 이상 반복
2. 반복 메타 문자는 탐욕적이다?
정규표현식을 공부하다보면 탐욕적이다/게으르다 와 같은 표현들을 접하곤 합니다. 그 이유는 +와 *와 같은 메타 문자들이 Greedy quantifiers라고 표현되기 때문인데요. 왜 Greedy/Lazy 라는 단어를 사용할까요? 우선은 의미적으로 먼저 파악해봅시다. 당신이 두 명의 친구를 각각 집에 초대했다고 가정해보겠습니다.
2-1. 의미적인 관점에서
대화1
나 : 친구야 치킨 먹어 푸라닭 알지? 블랙 알리오 치킨이야 나 전화하고 올테니까 먹고 있어
친구 A : 응 알겠어 (와구와구 와구와구)
대화2
나 : 친구야 치킨 먹어 푸라닭 알지? 블랙 알리오 치킨이야 나 전화하고 올테니까 먹고 있어
친구 B : 응 알겠어 (와구와구 와구와구)
대화1
나 : 친구야 왜 내 치킨은 없어? 왜 너가 다 먹었어?
친구 A : 응? 하나만 먹으라는 얘기는 안했잖아?
나 : ......
대화2
친구 B : 친구야 이 치킨 참 맛있다 닭다리 먹으렴
나 : 너는 상도덕이라는게 있는 놈이구나?
여기서 친구 A를 Greedy, 친구 B를 Lazy라고 할 수 있습니다.
2-2. 정규표현식의 관점에서
다음의 발화를 한번 분석해 봅시다.
치킨집 이름좀 말해봐 굽네치킨 치킨집 이름 또 말해봐 네네치킨
치킨으로 시작해서 치킨으로 대화가 끝나죠?
.+를 사용하면 치킨과 치킨 사이의 모든 문자를 인식합니다. 하지만, 엄밀히 따지면 이 문장은 두개의 파트로 구분되어 있는데요.
치킨집 이름좀 말해봐 굽네치킨 | 치킨집 이름 또 말해봐 네네치킨
즉, 네네치킨에는 고추바사삭이 없고 굽네치킨에는 스노윙치킨이 없다 이 뜻입니다(???). 여기서 +를 사용하면 탐색이 가능한 범위중 가장 길이가 긴 문자열을 인식한다는 것을 알 수 있습니다. 이를 Greedy Search라고 합니다.
하지만 +옆에 물음표를 사용하면 굽네치킨과 네네치킨을 서로 나누어서 인식한 것을 알 수 있습니다. 즉, 탐색이 가능한 범위중 가장 길이가 짧은 문자열을 인식한다는 것을 알 수 있습니다. 이를 non-Greedy(Lazy) Search라고 합니다.
+, * : 상도덕 없는 친구
+?, *? : 상도덕 있는 친구
이렇게 생각하면 좀 더 쉽지 않을까요?
3. 반복 메타 문자의 활용
몇 번을 반복할지 범위를 정할 수 있습니다.
3-1. 문법적인 측면에서
{}를 활용하면 문자 반복 횟수를 정할 수 있습니다.
1. {n} : 앞에 위치하는 문자가 n번 반복되어야 합니다. (정확한 횟수 지정)
2. {n,} : 앞에 위치하는 문자가 n번 이상 반복되어야 합니다. (최소 횟수 지정)
3. {n,m} : 앞에 위치하는 문자가 n번 이상 m번 이하 반복되어야 합니다. (범위 지정)
3-2. 조건으로 활용
군번에도 규칙이 있습니다. 앞의 두 글자는 년도이고 장교/부사관/병 종류에 따라 뒷 글자 자릿수가 달라집니다. 예를 들어, 장교의 군번 뒷자릿수는 5자입니다.
위와 같이 마지막 자리수가 5자리인 경우를 \d{5}와 같이 지정하여 일치 조건으로도 활용할 수 있습니다.
4. 반복을 하고 싶지 않다면?
굳이 반복을 하고 싶지 않을 때도 있습니다. 즉, 딱 한번만 인식되거나 인식되지 않도록 할 수 있습니다. 이때는 ?를 활용하면 됩니다.
지금 까지 +/*/?/{}/+?/*? 총 6개의 반복 메타 문자에 대해서 다루어 봤습니다. 다음 글에서는 하위 표현식에 대해서 다룰 수 있도록 하겠습니다.
'딥상어동의 딥한 데이터 처리 > 전처리' 카테고리의 다른 글
[Python] np.where을 이용하여 두 개의 데이터프레임 전체를 비교하기 (0) | 2022.01.23 |
---|---|
[Pandas] 판다스에서 SQL 윈도우 함수 사용해보기 (0) | 2021.12.27 |
정규표현식 뽀개기 (2) - 메타 문자 이해하기 (0) | 2021.10.24 |
정규표현식 뽀개기 (1) - 정규표현식을 배우는 이유 (0) | 2021.10.20 |
[Pandas] str.contains를 사용하는 이유 - 정규표현식 (0) | 2021.09.26 |
제 블로그에 와주셔서 감사합니다! 다들 오늘 하루도 좋은 일 있으시길~~
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!