프로그래머스 1단계를 풀면서 문자열 치환하는 문제가 나왔다.
역시 나의 무지성 코드들로 우당탕탕 성공은 했다.
그러나 다른 사람들의 코드를 보니 처음보는 '정규식'이란게 있었다.
정리하려고 한다.
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 |