티스토리 뷰
오늘은 정규표현식에 대해 정리해보려고 합니다.
정규표현식을 모르는 사람이 표현식을 보면 매우 난해하게 느껴지지만 알고 사용하면 정말 정말 유용하기 때문에, 겁먹지 마시고 공부해보시길 바랍니다 (문자열 처리에 수십 줄의 코드를 작성해야 할 걸 단 몇 줄 만에 끝낼 수 있거든요!)
정규표현식은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어 입니다. (위키 참고)
이 정규표현식을 사용하면 특정한 규칙을 만족하는지 유효성 검사에 유용하기 때문에 사용자가 입력한 이메일이나 비밀번호가 우리가 만들어 놓은 패턴 혹은 규칙과 부합하는지 쉽게 확인할 수 있습니다.
우선 정규표현식을 사용하려면 사용방법을 알아야겠죠?
정규 표현식에는 다음과 같은 *메타 문자들이 사용됩니다.
* 메타 문자: 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자
. ^ $ * + ? { } [ ] \ | ( )
예를 들어 [a-z]로 표현하면 문자열에서 소문자 a부터 z까지 문자열에서 알파벳 소문자하고만 매치가 됩니다.
[0-9] -> 문자열에서 0~9 숫자 하고만 매치
[a-zA-Z] -> 문자열에서 모든 알파벳과 매치
그럼 각 문자가 어떤 의미를 나타내는지 문법을 살펴보져!
먼저 regexr.com 여기로 들어가서 아래의 문법들을 같이 확인해보시길 추천드립니다.
사용 방법은, 다음과 같이 양쪽 / 안에 정규식을 넣어주시면 됩니다. 다음과 같이요 -> /정규식/
그럼 정규식에 맞는 문자들을 찾아서 하이라이트로 표시해 주기 때문에 빠르게 결과를 확인하기 좋습니다.
| | 또는(or) |
( ) | 그룹 짓기 |
[ ] | 문자 셋 (괄호 안에 포함된 어떤 문자든 매칭) |
[^ ] | 문자 셋 부정 (괄호 안의 문자가 아닌것들과 매칭) |
0. 일반적인 단어 매칭
1. | 사용 예
2. ( ) 사용 예
3. [ ] 사용 예
4. [^ ] 사용 예
? | 있거나 없거나 (즉, 한개가 있거나 아예 없거나) |
* | 없거나 한개 이상 있을 때 |
+ | 한개 이상 있을 때 |
{n} | n번 반복 |
{min, } | 최소 ~ |
{min, max} | 최소 ~ 최대 |
1. ? 사용 예
2. * 사용 예
3. + 사용 예
4. {n} 사용 예
5. {min, } 사용 예
6. {min, max} 사용 예
아래의 두 개 표를 잘 보시면 \소문자는 특정 조건에 부합하는 문자를 구분하거나 찾는 경우이고 \대문자는 소문자 조건과 반대의 형식으로 동작하는 것을 볼 수 있습니다.
\b | 단어 구분자 |
\B | \b 반대의 경우 (단어 구분자에 해당 안되는 경우) |
^ | 문자열의 시작 |
$ | 문자열의 끝 |
1. \b 사용 예
2. \B 사용 예
3. ^ 사용 예
4. $ 사용 예
. | 줄 바꿈 문자를 제외한 모든 문자 |
\d | 숫자 |
\D | 숫자가 아닌 것 |
\w | word 문자 |
\W | word 문자가 아님 |
\s | 공백 |
\S | 공백 아님 |
1. . 사용 예
2. \d 사용 예
3. \D 사용 예
4. \w 사용 예
5. \W 사용 예
6. \s 사용 예
7. \S 사용 예
정규표현식은 언어별로 차이가 없지만, 각각 언어의 지원 모듈, 라이브러리에 따라 사용법에 차이가 있으니 사용하시는 언어별로 사용법을 공부하셔서 사용하시면 될 것 같습니다.
파이썬은 아래의 점프 투 파이썬 정규식 글 추천드립니다 :)
간단하게 문자열 처리 알고리즘 하나 풀어볼까요?
문제는 2018 KAKAO BLIND RECRUITMENT 3차에 나온 파일명 정렬이라는 문제입니다.
programmers.co.kr/learn/courses/30/lessons/17686?language=python3
문제를 보면 아시겠지만, 정규식을 쓰지 않고 문제를 풀게 되면, 문자열을 반복문을 통해 순회하며 조건문으로 처리해줘야 하기 때문에 코드량이 많아지게 됩니다. 하지만 우리가 배운 정규식을 쓰면 다음과 같이 적은 코드로 문제를 해결할 수 있습니다.
파이썬 코드)
import re
def solution(files):
return sorted(files, key = lambda x: (re.findall("[^0-9]+", x)[0].lower(), int(re.findall("\d+", x)[0])))
흔히 많이 축약한 코드는 가독성이 떨어져 좋지 않다고도 하는데, 이 코드는 축약을 했다기보다 정규식을 사용함으로써 불필요한 반복문과 조건문이 사용되지 않아 코드가 짧아진 것이기 때문에 파이썬을 사용하고 정규식에대한 이해가 있다면 읽기 어려운 코드는 아니라고 생각합니다 :)
긴 글 읽어주셔서 감사합니다!
'알고리즘 > 정리' 카테고리의 다른 글
기본 정렬 알고리즘 알아보기 with Python (0) | 2020.09.29 |
---|---|
알고리즘 시간 복잡도와 빅오 표기법 (0) | 2020.05.28 |
알고리즘 순서도 그리는 방법, 알고리즘 공부 법 (1) | 2020.05.26 |