[11주차] Do it! 파이썬 스터디 노트 - 점프 투 파이썬

2023. 9. 16. 22:19Python/Do it! 파이썬 스터디 2기

728x90

Do it! 파이썬 스터디 노트: 점프 투 파이썬 전면 - 개정 2판

 

 

1. 《Do it! 점프 투 파이썬》 -전면 개정 2판 글감을 추가해주세요. 

 
 

 

 

 

2. 미션 인증샷을 남겨 주세요! (책과 함께 공부하는 모습을 찍어주세요! 책과 모니터가 함께 보이면 더 좋아요!)

 

 

 

 

3. 이번 미션을 진행하면서 좋았던 점이나 어려웠던 점 또는 새로 알게 된 점이 있었나요? (200자 내외 / 실습 부분을 캡쳐해도 좋아요!)

 
📖
미션 범위 (점프 투 파이썬 책 페이지)
일정
11주차
정규표현식 (355pg - 384pg)
9/4-9/10

 

저자님께서 '정규 표현식'을 이 책에 포함해야 할지 오랜 시간 고민하셨다고 합니다. 고급 주제이기 때문에 초보자를 대상으로 하는 책에는 어울리지 않을 수 있기 때문인데요. 정규 표현식을 익히기만 하면 파이썬 외에 또 하나의 강력한 무기를 얻게 되기에 중요하다고 합니다. 하지만 입문자에게는 어려운 내용이니 부담은 갖지 말고 산책하듯 읽어보라고 하시네요. 책의 내용은 파이썬 공식 문서에서 소개하는 내용이라고 합니다. ( https://docs.python.org/3.11/howto/regex.html )

 

 

1. 정규 표현식 살펴보기

- 정규 표현식(Regular Expressions): 복잡한 문자열을 처리할 때 사용하는 기법으로 파이썬 외 문자열을 처리하는 모든 곳에서 사용하는 일종의 형식 언어

- 주민등록번호를 포함하고 있는 텍스트가 있다. 이 텍스트에 포함된 모든 주민등록번호의 뒷자리를 * 문자로 변경해 보자.

. 정규식을 모르는 경우

1) 전체 텍스트를 공백 문자로 나눔(split) | 2) 나뉜 단어가 주민등록번호 형식인지 조사

3) 단어가 주민등록번호 형식이라면 뒷자리를 *로 변환 | 4) 나뉜 단어를 다시 조립

. 정규식을 사용하면 훨씬 간편하고 직관적인 코드 작성이 가능

 

​2. 정규 표현식 시작

- 메타 문자(meta characters): 그 문자가 가진 뜻이 아닌 특별한 의미를 가진 문자 → . ^ $ * + ? { } [ ] \ | ( )

- 문자 클래스(character class): []

. 의미: '[' 와 ']' 사이의 문자들과 매치

- [ ] 안의 두 문자 사이에 하이픈(-)을 사용하면 두 문자 사이의 범위를 의미

※ [a-zA-Z] : 알파벳 모두 / [0-9] : 숫자 / ^사용: 반대(not)의 의미

→ \d = [0-9] | \D = [^0-9] | \s = [ \t\n\r\f\v] | \S = [^ \t\n\r\f\v] | \w = [a-zA-Z0-9_] | \W = [^a-zA-Z0-9_]

- .(dot)문자: : 줄바꿈 문자인 \n을 제외한 모든 문자와 매치

. a.b: a와 b라는 문자 사이에 줄바꿈 문자인 \n을 제외한 모든 문자와 매치

. a[.]b: 'a.b' 하고만 매치

- *문자: * 바로 앞에 있는 문자가 0부터 무한대로 반복될 수 있다는 의미

- +문자: + 바로 앞에 있는 문자가 최소 1번 이상 반복될 때 사용

- {m,n}와 ?문자: 반복 횟수가 m부터 n회 까지 반복되어 매치되며, ? 메타문자가 의미하는 것은 {0, 1}

- re(regular expression) 모듈: re.compile을 사용하여 정규 표현식을 컴파일

- 정규식을 이용한 문자열 검색

. match(): 문자열의 처음부터 정규식과 매치되는지 조사 (부합되지 않을 때는 None 리턴)

. search(): 문자열 전체를 검색하여 정규식과 매치되는지 조사

. findall(): 패턴과 매치되는 모든 값을 찾아 리스트로 리턴

. finditer(): 패턴과 매치되는 모든 값을 반복 가능한 객체(iterator object)로 리턴

- match 객체의 메서드

. group(): 매치된 문자열을 리턴

. start(): 매치된 문자열의 시작 위치를 리턴

. end(): 매치된 문자열의 끝 위치를 리턴

. span(): 매치된 문자열의 (시작, 끝)에 해당하는 튜플을 리턴

- re 모듈의 축약: p = re.compile('[a-z]+') + m = p.match("python") → m = re.match('[a-z]+', "python")

- 컴파일 옵션: re.DOTALL = re.S

. DOTALL(S): .(dot)이 줄바꿈 문자를 포함해 모든 문자와 매치

. IGNORECASE(I): 대소문자에 관계없이 매치

. MULTILINE(M): 여러 줄과 매치. ^(처음), $(마지막) 메타 문자의 사용과 관계가 있는 옵션

. VERBOSE(X): verbose 모드를 사용. 정규식을 보기 편하게 만들 수 있고 주석 등을 사용 가능

- 역슬래시 문제

. 정규식 엔진(정규식을 해석하고 수행하는 모듈)에 \\ 문자를 전달하려면 \\\\처럼 역슬래시를 4개 사용

. 정규식 문자열 앞에 r 문자를 삽입: raw string 규칙에 의하여 역슬래시 1개만 써도 2개를 쓴 것과 동일한 의미 (r'\\')

 

3. 강력한 정규 표현식의 세계로

- 문자열 소비가 없는 메타 문자

. |: or | ^: 문자열의 맨 처음과 일치 | $: 문자열의 끝과 매치 | \A: 문자열의 처음과 매치 | \Z: 문자열의 끝과 매치

. \b: 단어 구분자(Word boundary)로써 앞뒤가 화이트스페이스로 구분된 단어와 매치 ← 백스페이스가 아님을 나타내기 위해 r붙임

. \B: 화이트스페이스로 구분된 단어가 아닌 경우에만 매치

- 그루핑(Grouping): 그룹을 만들어 주는 메타 문자로 ()

. group(인덱스): group(0)=매치된 전체 문자열 | group(1)=첫 번째 그룹에 해당되는 문자열 | group(n)=n 번째 그룹에 해당되는 문자열

. 그루핑한 문자열을 재참조(Backreferences): \1은 정규식의 그룹 중 첫 번째 그룹, 두 번째 그룹을 참조하려면 \2를 사용

- 그루핑된 문자열에 이름 붙이기: 그룹을 인덱스가 아닌 이름(named groups)으로 참조

. (\w+) → (?P<name>\w+)

. 재참조: (?P=그룹이름)

- 전방 탐색(lookahead assertions)

. 긍정형 전방 탐색 (?=...): ... 에 해당되는 정규식과 매치되어야 하며 조건이 통과되어도 문자열이 소비되지 않음

. 부정형 전방 탐색 (?!...): ...에 해당되는 정규식과 매치되지 않아야 하며 조건이 통과되어도 문자열이 소비되지 않음

- sub 메서드: 정규식과 매치되는 부분을 다른 문자로 쉽게 변경

. 첫 번째 인수: 바꿀 문자열(replacement) | 두 번째 인수: 대상 문자열 | 세 번째 인수: 바꾸기 횟수

※ subn 메서드: sub와 동일한 기능이지만 반환 결과가 튜플 (튜플의 첫 번째 요소: 변경된 문자열, 두 번째 요소: 바꾸기가 발생한 횟수)

. sub의 바꿀 문자열 부분에 \g<그룹이름>을 사용: 정규식의 그룹 이름을 참조 가능 (참조 번호도 마찬가지 결과를 리턴)

. sub 메서드의 첫 번째 인수에 함수 전달도 가능

- 정규식에서 탐욕스러운(greedy) 의미: 최대한 많이 매칭 → <.*> 정규식

. non-greedy 문자: 최소한으로 반복을 수행하도록 도와주는 ?이며 *?, +?, ??, {m,n}?와 같이 사용 → <.*?>

 

 

 

 

4. 스터디를 같이 진행하는 분들과 (동지들과!) 함께 이야기 나누고 싶은 부분이 있다면 작성해 주세요!

 

아! 정규식 너무 어려운 것 같습니다. 저자님처럼 잘 활용하지는 못하겠지만 그래도 가장 기본적인 내용을 써보려고 노력 중입니다. [a-zA-Z0-9] 및 match(), findall() 정도인데 필요할 때 생각이 안 나면 다시 책을 보거나, 혹은 공식 문서에 정리된 내용을 참고하여 적용할 수는 있을 것 같아서 다행입니다.

 

 

□ 1년 전 스터디 노트 (개정판)

https://cafe.naver.com/doitstudyroom/38547

 

 

 

728x90