[Do it] 점프 투 파이썬 - 10일차
1. 기본 내용
공부 날짜: 2019년 8월 11일 (일)
2. 스터디 내용
공부 범위:
1장 파이썬이란 무엇인가?
2장 파이썬 프로그래밍의 기초, 자료형
3장 프로그램의 구조를 쌓는다! 제어문
4장 프로그램의 입력과 출력은 어떻게 해야 할까?
5장 파이썬 날개 달기
6장 파이썬 프로그래밍, 어떻게 시작해야 할까?
7장 정규 표현식
공부 내용:
7-1 정규 표현식 살펴보기
--- 정규 표현식 ( Regular Expressions )
복잡한 문자열을 처리할 때 사용하는 기법으로,
python만의 고유 문법이 아니라 문자열을 처리하는 모든 곳에서 사용한다.
--- 정규 표현식을 사용할 때는 re 모듈을 import한다.
7-2 정규 표현식 시작하기
--- 메타 문자 -> . ^ $ * + ? { } [ ] \ | ( )
원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자를 말한다.
--- 문자 클래스 [ ]
“[ ] 사이의 문자들과 매치”라는 의미를 갖는다.
[alz] -> ”apps” : 정규식과 일치하는 문자 a가 있다. -> 매치 O
[alz] -> “lu175” : 정규식과 일치하는 문자 l이 있다. -> 매치 O
[alz] -> “hi” : 정규식과 일치하는 문자가 없다. -> 매치 X
문자 클래스 안에서 “-”은 두 문자 사이의 범위를 의미한다.
[a-d] -> [abcd]
[1-7] -> [1234567]
[a-zA-Z] : 알파벳 모두와 매치
[0-9] : 숫자와 매치
문자 클래스 안에서 “^”은 NOT의 의미를 갖는다.
[^0-9] : 숫자가 아닌 문자와 매치
[^a-zA-Z] : 알파벳이 아닌 문자와 매치
--- 자주 사용하는 문자 클래스
자주 사용하는 정규식은 별도의 표기법
\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]의 의미와 같다. ( re.DOTALL옵션으로 \n문자와도 매치할 수 있다. )
a.b -> “a + 모든 문자 + b”
-> “aab” : 매치 O
-> “a0b” : 매치 O
-> “abd” : 매치 X
a[.]b -> “a.b”
--- 반복 ( * )
* 앞의 문자가 0번 이상 반복되면 매치
ca*t -> “ct” -> 매치 O
-> “cat” -> 매치 O
-> “caaaat” -> 매치 O
--- 반복 ( + )
+ 앞의 문자가 1번 이상 반복되면 매치
--- 반복 ( {m, n}, ? )
{m} : m번 반복되면 매치
ca{2}t -> “caat”
{m, n} : m~n번 반복되면 매치
ca{2, 5}t -> “c + a(2~5번 반복) + t”
{?} : 메타 문자 ?는 {0, 1}을 의미한다. (반복이라고 볼 순 없다.)
ab?c -> “a + b(있어도 되고 없어도 된다) + c”
--- {m, n}도 좋지만 가급적 이해하기 쉬운 메타 문자(*, +, ?)를 사용하자.
--- Python에서 정규식을 지원하는 re 모듈
re.compile() 함수를 사용해서 정규 표현식을 컴파일 한다.
패턴 : 정규식을 컴파일 한 결과 (객체)
--- 정규식을 사용한 문자열 검색
match() : 문자열의 처음부터 정규식과 매치되는지 조사
search() : 문자열 전체를 검색하여 정규식과 매치되는지 조사
findall() : 정규식과 매치되는 모든 문자열을 리스트로 반환
finditer() : 정규식과 매치되는 모든 문자열을 iterable한 개체로 반환
match(), search()는 매치되면 match객체를 반환하고, 매치되지 않으면 None을 반환한다.
--- match
--- search
--- findall
--- finditer
--- match 객체의 메서드
match 객체는 match()와 search()가 반환한 것이다.
group() : 매치된 문자열을 반환
start() : 매치된 문자열의 시작 위치 반환
end() : 매치된 문자열의 끝 위치 반환
span() : 매치된 문자열의 시작과 끝 위치를 튜플로 반환
--- 모듈 단위로 수행하기
한 번 만든 패턴 객체를 여러 번 사용할 때는 이전에 사용하던 re.compile()이 더 편하다.
--- 컴파일 옵션
DOTALL (약어: S) : Dot( . )문자가 \n을 포함하여 모든 문자와 매치
IGNORECASE (약어: I) : 대.소문자에 관계 없이 매치
MULTILINE (약어: M) : 여러 줄과 매치 (메타 문자 ^, $와 관계 있는 옵션)
VERBOSE (약어: X) : verbose모드를 사용 (정규식을 보기 편하기 만들거나 주석 가능)
--- re.DOTALL 또는 re.S
메타문자 Dot( . )을 사용할 때 개행 문자(\n)도 매치에 포함하고 싶을 때 사용.
여러 줄로 이루어진 문자열에서 \n에 상관없이 검색할 때 많이 사용.
--- re.IGNORECASE 또는 re.I
--- re.MULTILINE 또는 re.M
메타문자 (^, $)
^ : 처음을 의미
$ : 마지막을 의미
^python : python으로 시작하면 매치
python$ : python으로 끝나면 매치
re.MULTILINE을 사용하지 않으면 첫번째 줄만 매치를 확인한다.
각 라인의 첫번째가 python인지 확인하려면 re.MULTILINE을 사용하면된다. (아래)
--- re.VERBOSE 또는 re.X
문자열 내부에서 문자 클래스[ ] 내부의 whitespace를 제외한 whitespace를 제거한다.
#을 사용해서 문자열 내에서 행 주석을 달 수 있다,
--- 백슬래시 문제
파일 안의 “\section”을 찾을 때 \s부분이 whitespace로 해석되어서 의도대로 안된다.
이러한 경우에는 “\\section”으로 작성해서 \문자가 문자열 자체임을 알려야 한다.
그러나 python의 literal 규칙에 의해 \\이 \로 바뀌어 \section으로 전달된다.
그러므로 원하는 결과를 얻으려면 “\\\\section”으로 작성해야 하는데 너무 복잡하다.
문자열 앞에 r을 붙이면 Raw String 규칙에 의해 \를 하나만 써도 2개와 같은 의미가 됨.
(백슬래시를 사용하지 않는 정규식에서는 r의 유무에 상관없이 같은 정규식이다.)
3. 스터디 후기
스터디 도중 발생한 문제, 어려웠던 점을 어떻게 해결했는지?
X
간단한 소감
문자 검색 시 문자열의 표현과 코드 라인을 줄여서 간단하게 표현할 수 있는 정규 표현식을 배웠다. python에서만 아니라 다른 언어에서도 적용되는 표현이라서 앞으로 문자열을 다룰 때 좀더 편해질 것 같다.
재미있었다.
다음 스터디 예정일
2019년 8월 12일 (월)