과거의 유산들/python

정규식

빈나 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만 출력한다.

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

 

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

 

 

 

 

반응형

'과거의 유산들 > python' 카테고리의 다른 글

큐 list or Deque  (0) 2022.08.04
zip(), 조합 구하는 함수  (0) 2022.08.03
for a,b in 이중 리스트  (0) 2022.07.17
파이썬 fstring,문자와 데이터 같이 넣기  (0) 2022.06.28
얕은 복사 깊은 복사  (0) 2022.06.26