개발할 때 노가다할 일이 많아서 정규표현식을 종종 익혀두었었다.
하지만 정규식이 워낙 직관적이지 않다 보니 머릿속에 남는 건 \n, \s, \r, \t .* 뿐이다.
그 유용성을 잘 알면서도 공부하기 재밌는 분야는 아니다.
하지만 이번에도 어김없이 정규식의 힘이 필요했다.
I/P R&D 팀프로젝트를 하는데 팀원들의 검색식을 통합해서 정형화시키고 RDB에 넣고 싶었다.
그렇게 해서 중복된 키워드는 뭔지, 중복 안된 키워드는 뭔지 파악해서
누구 한 명의 생각도 빠뜨리지 않고 살펴보고 싶었다.
그 과정에서 느낀점, 정규식을 공부하고 활용한 내용을 정리했다.
(툴은 NotePad++, 참조한 책은 "손에 잡히는 10분 정규 표현식".)
***디지털 노가다
1. 각 팀원들의 식을 분류하려고 user라는 키워드를 추가했다.
2. 각 카테고리를 분류하려고 카테고리를 표시하는 숫자를 추가, 통일시켰다.
3. 식 외에 코멘트들은 다 없앴다.
(이래서 양식이 필요한 것임을 절실히 느꼈다.
양식대로 작성되도록 했다면 위의 노가다는 하지 않아도 되었다.)

4. 각각이 쓴 식의 패턴을 파악했다.
-> 위의 이미지처럼 field를 쓴건 TAC밖에 없었고 각 키워드 그룹의 연결은 AND로 묶여있다.
5. 미션이 나왔다. 각 키워드를 기준으로 하나의 레코드(row)를 만들어 내기.

필요 작업1. AND로 연결된 카테고리를 분리.-> 이건 그냥 쉽게 완료. AND 찾아서 \n 정규식 쓰면 되니깐.
필요 작업2. 괄호 안에 스페이스로 구분되어 있는 키워드를 분리하기. 이것도 쉽게 됨.
필요 작업3. 그런데 키워드 구분 패턴이 스페이스만으로 구분되어있지 않다. A/1, N/1 로 양옆으로 연결되어 있는 것은 하나의 키워드로 보고 따로 빼내야 했다.
**필요한 정규식 스터디.
1. * 과 + 같은 메타 문자는 가능한 가장 큰 덩어리를 찾는다.
+는 하나 이상 연속된 문자를 찾는다. 최소한 하나는 있어야 찾는다.
*는 문자가 없어도 찾는다.
2. [] 는 대괄호 안에 문자(들)가 포함된 집합. (대괄호 사이는 OR로 서치된다)
3. ?는 물음표 앞에 문자가 하나 있거나 없으면 찾아진다.
4. 마침표는 문자 하나 선택.
5. \w 는 모든 문자. 숫자를 찾는다. [a-zA-Z0-9] 와 같다.
6. 조건식(?). 물음표는 바로 앞에 문자나 표현이 있으면, 그 문자 또는 표현식과 일치한다.
ex) ?(1) 은 조건식으로 사용한 물음표 앞에 식을 실행한다는 뜻.
7. 전방탐색(?=)은 ?= 뒤에 오는 문자에 매칭되는 것을 찾고 그 앞에 있는 항목이 찾아짐.
8. 후방탐색(?<=)은 ?<= 뒤에 오는 문자에 매칭되는 것을 찾고 그 뒤에 있는 항목들이 찾아짐.
9. 치환(= 찾아진 텍스트들을 바꾸기) : $숫자를 사용하여 정규식에 쓰인 '검색식 항목'을 지정하고 작업하면 됨. 이때 '검색식 항목'은 괄호로 묶어있어야 한다.
ex) 정규표현식이 (\w+) 이랬다면 모든 문자, 숫자가 선택될 것이고 바꾸기 란에 $1\n 을 적는다면 괄호로 묶인 정규식에 의해 찾아진 단어들이 줄바꿈될 것이다.
아래 활용 한 이미지가 있다.
**위의 메타문자들을 활용
방법1.
[\(\)\s\w].*?[\)\(]
-> 괄호 앞뒤로, 괄호 안 모두 선택.



방법2.
.*?[\)]
-> 끝괄호를 중심으로 선택.




방법1, 2의 문제1.
-> a/1과 n/1 양옆의 괄호는 하나의 키워드로 본다.
키워드 그룹을 묶는 괄호안에 다른 키워드들과 같은데 얘가 그룹괄호로 인식됨.
얘를 그룹괄호로 인식되지 않게 해야함.
--------> 해결 : 전방탐색(?=)과 후방탐색(?<=) 사용.
방법3.
(?<=[\(\)]).+?(?=\))



방법3의 문제1.
-----> 문제 : 정규식에 포함된 괄호는 선택되지 않지만 여전히 A/n 이나 N/n 양옆으로 쓰여진 것을 한 키워드로 구분할 수 없음.
------>해결:: 그냥 예외인 경우도 따로 식을 만들어서 or 연산자(|) 로 다 찾아지도록하기.
방법4.
([\(\w].*?A\/\d.*?\))|([\(\w].*?N\/\d.*?\))|(\w.*?\))

---> 방법4로 a/1이나 n/1 그 양옆을 같은 쓰인것을 찾음.
추가작업1. 맨 처음에 시작하는 괄호들을 다 없앰.
^[\(\)]


추가작업2. n/1, a/1 양옆을 한 키워드로 인식하도록 따로 떼어놓음.(줄바꿈.)
\(.*\)

추가작업2에서 찾은 내용 앞에 엔터추가 (치환) : \n$1

추가작업3. 빈줄 없앰. (edit - Line Operations - Remove emty lines)

추가작업4. 괄호로 시작하지 않는 줄 선택. (별 의미는 없었다. 어차피 수작업이 약간은 들어가야 했다.)
^[^(^\()]+

추가작업5. 엑셀에 옮기며 데이터 정제 마무리

추가작업 6. 관계형DB(sql) 에 데이터 저장...

**결과물 ::::: 각 기능별 팀원들이 많이 사용한 키워드들의 순위를 구했다. 이로써 공통적인 생각을 알 수 있었다.

'강의와 책 정리' 카테고리의 다른 글
| 프롬프트 엔지니어링 이해 (0) | 2024.08.12 |
|---|---|
| 클린코드란? (0) | 2024.08.12 |
| 특허강의 20 (0) | 2024.05.30 |
| 특허강의 15 : 엑셀그래프로 데이터 동향분석 결과물 내기. (0) | 2024.05.22 |
| 특허강의 14일차 : 직접 특허출원 하기 (0) | 2024.05.21 |