빈나 2022. 7. 29. 17:46
반응형

프로그래머스 1단계를 풀면서 문자열 치환하는 문제가 나왔다.

역시 나의 무지성 코드들로 우당탕탕 성공은 했다.

그러나 다른 사람들의 코드를 보니 처음보는 '정규식'이란게 있었다.

정리하려고 한다.

https://wikidocs.net/4308

 

07-2 정규 표현식 시작하기

[TOC] ## 정규 표현식의 기초, 메타 문자 정규 표현식에서 사용하는 메타 문자(meta characters)에는 다음과 같은 것이 있다. > ※ 메타 문자란 원래 ...

wikidocs.net

 

 

와 엘리스강의를 참고 했다. 저의 하찮은 머리로 정리했기에 틀린게 있을 수 있습니다.

 

1.re모듈

사실 정규표현식은 언어불문으로 사용가능하기에 따로 모듈이 필요하진 않다. 그러나 파이썬은 정규표현식을 지원하는 모듈이 있어 더 알려준다.

 

a = re.compile('pattern')을 통해 a에게 정규식 객체라는 것을 반환한다.

그러면 a 안에 정규표현식 패턴이 들어와, re모듈의 함수들을 쓸 수 있다. 더불어 인자값에 패턴을 일일이 넣어 줄 필요 없어,

많고 긴 정규식을 쓸때 좋다고 한다.

 

또한 re.sub라는 모듈로 정규식을 이용가능하다

import re #모듈을 쓰기 위해

re.sub(pattern,new,old) #old문자열을 pattern에 행당하는 거에 따라 new로 바꿔준다

아직 못배운 re모듈은 나중에 더 공부하고 추가해야겠다.

정규식 검사 함수(re.match(), re.search(), re.findall(), re.finditer()), 문자열을 검사하는 함수들!

문자열 수정 함수(re.sub,re.subn)

 

2.메타문자

 

^ : 문자열 시작, 단어 아님! 한 문자열의 시작

 

$ : 문자열의 끝

 

| : or 조건식

 

[] : |를 여러개 쓸려고 만들때 대괄호 안에 문자 넣기만 하면 or 조건식됨

그러나 여기서! []안에 ^를 쓴다면 시작의 의미가 아닌 not의 의미가 됨!

또한 -를 통해 범위 지정 가능. a부터 z까지면 [a-z]이렇게. 단 여기서 유니코드 순서대로 해야함

 

\d : 숫자 일일이 쓰기 귀찮으니까 숫자라는 의미

 

\D : 숫자가 아닌 모든 문자

 

\w : 알파벳 대소문자,숫자,밑줄

 

\W : 위에 빼고 남은 문자들

 

\s : 공백 문자들(탭, 스페이스바, 개행...)

 

\S : 공백 아닌 문자들

 

\n : 개행문자

 

\ : 이스케이프용 문자, 패턴 안에 $와 같은 문자는 이미 메타문자이기에 그 자체로 받아들여지지 않음

그래서 앞에 \를 붙여 $가 메타문자가 아닌 달러사인 자체로 받아들여지게끔 만드는 문자

 

. : 모든 문자, 그러나 []대괄호 안에 .은 메타문자가 아닌 그냥 마침표임. 따라서 c[.]t은 'c.t'임

 

(?i) : 패턴안에 이것을 넣으면 이것의 위치와 관계없이 그냥 대소문자를 무시한다는 뜻!

 

3. 수량자

문자들 반복해서 할당하고 싶은데 그것을 간편하게 나타내는 기호들

 

* : 바로 앞 문자 0번 이상 반복

 

+ : 1번 이상 반복

 

{n} : n번 반복

 

{n,m} : n번 이상, ,m번 이하 반복

 

{n,} : n번 이상

 

? : 0개 또는 1개, {0,1}과 같음

여기서 또다른 사용법!!!

수량자는 가능한 길게 매칭되는 문자들을 택함

따라서 그것을 자제하기 위해 수량자 뒤에 ?를 붙이면 가능한 최소 길이로 매칭되도록 함

 

사용예 : +?, ??, {n,}?, {n,m}?

 

4. 그루핑

여러 문자를 ()로 이용해 묶을려고 하는 것!

 

그래서 cat에서 at를 반복해서 찾고 싶으면 catatatatat하는게 아닌, c(at)+로 끝낼 수 있다.

 

또한 한번 묶은 그룹은 재사용도 가능해 (to)ma\\1하면 (to)ma(to)와 같은 효과가 일어난다.

원래는 \{몇번째 그룹}으로 표현하지만 \\로 메타문자로 표현하기 위해 2번 썻다.

 

여기서 주의할 점은 그룹을 이용해 findall 출력을 할때 그룹화한 패턴을 찾으면 그 패턴만 출력을 한다.

그래서 tomato potato를 (tom|pot)ato로 찾으면 tom,pot만 출력한다.

그래서 그것을 방지하고자 그룹 안에 ?:를 넣어주어 묶기만 해줄 수 있다고 한다.

 

다만 묶기만 하기에 앞에 참조를 못한다는 주의점이 있다고 한다.

 

 

 

 

반응형