본문 바로가기

Python_Beginer/Note

Python 수강 노트 3

< 190217 >

- 파이썬 기본 문법(정규식)

- 크롤링 / 빅데이터처리

- 장고(블로그앱)

- https://blog.naver.com/sdw1904 선생님 블로그 자료 공유

- 점프 투 파이썬 전자교재 다운로드

- 파이썬 / 파이참 다운로드 설치(환경 설정 변수)

- 정규 표현식(ch07)

  정규표현식(Regular Expressions) 복잡한 문자열을 처리할때 사용하는 기법

  모든 곳에서 사용

- 디버깅시 한줄 한줄 프린터를 해서 보면 편하다.

- 정규표현식

  1. 문자 클래스 [](character class)

     문자 클래스로 만들어진 정규식은 "[와 ] 사이의 문자들과 매치"라는 의미를 갖는다.

^ 메타 문자가 사용될 경우에는 반대(not)라는 의미를 갖는다.

[^0-9]라는 정규 표현식은 숫자가 아닌 문자만 매치

[a-zA-Z] : 알파벳 모두 / [0-9] : 숫자

[자주 사용하는 문자 클래스]

[0-9] 또는 [a-zA-Z] 등은 무척 자주 사용하는 정규 표현식이다. 이렇게 자주 사용하는 정규식들은 별도의 표기법으로 표현할 수 있다. 다음을 기억해 두자.

\d - 숫자와 매치, [0-9]와 동일한 표현식이다.

\D - 숫자가 아닌 것과 매치, [^0-9]와 동일한 표현식이다.

\s - whitespace 문자와 매치, [ \t\n\r\f\v]와 동일한 표현식이다. 맨 앞의 빈 칸은 공백문자(space)를 의미한다.

\S - whitespace 문자가 아닌 것과 매치, [^ \t\n\r\f\v]와 동일한 표현식이다.

\w - 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9_]와 동일한 표현식이다.

\W - 문자+숫자(alphanumeric)가 아닌 문자와 매치, [^a-zA-Z0-9_]와 동일한 표현식이다.

대문자로 사용된 것은 소문자의 반대임을 추측할 수 있을 것이다.

  2. Dot .

줄바꿈 문자인 \n를 제외한 모든 문자와 매치됨을 의미

"aab"는 가운데 문자 "a"가 모든 문자를 의미하는 .과 일치하므로 정규식과 매치된다.

"a0b"는 가운데 문자 "0"가 모든 문자를 의미하는 .과 일치하므로 정규식과 매치된다.

"abc"는 "a"문자와 "b"문자 사이에 어떤 문자라도 하나는있어야 하는 이 정규식과 일치하지 않으므로 매치되지 않는다.

문자 클래스([]) 내에 Dot(.) 메타 문자가 사용된다면 이것은 "모든 문자"라는 의미가 아닌 문자 . 그대로를 의미.

a.b -> aab acb

a[.]b   -> a.b 

  3. 반복 *

사용된 *의 의미는 *바로 앞에 있는 문자 a가 0부터 무한대로 반복될 수 있다는 의미.

ca*t -> ca*(0~무한대)t -> ca*0t -> ct

-> ca*1t -> cat

     -> ca*2t -> caat

  4. 반복 +

+는 최소 1번 이상 반복될 때 사용한다. 즉, *가 반복 횟수 0부터라면 +는 반복 횟수 1부터인 것.

ca+t -> ca+(1개이상)t -> cat

ca+t -> ca+(1개이상)t -> caat

ca+t -> ca+(1개이상 무한대)t -> caaat

  5. 반복 {m,n}, ?

-> {m} 

   ca{2}t -> c + a(반드시 2번 반복) + t

-> {m, n}

   ca{2,5}t -> c + a(2~5회 반복) + t

    -> ?

   ab?c -> a + b(있어도 되고 없어도 된다) + c

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

match()     문자열의 처음부터 정규식과 매치되는지 조사한다. match의 결과값이 있을 때만 그 다음 작업을 수행.

search() 문자열 전체를 검색하여 정규식과 매치되는지 조사한다. ID 중복 체크에 많이 사용된다.

findall() 정규식과 매치되는 모든 문자열(substring)을 리스트로 리턴한다 for 문에 자주 사용된다.

finditer() 정규식과 매치되는 모든 문자열(substring)을 iterator 객체로 리턴한다 

  7. match 객체의 메서드

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

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

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

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

  8. 컴파일 옵션(약어)

DOTALL(S)     - . 이 줄바꿈 문자를 포함하여 모든 문자와 매치할 수 있도록 한다. \n 문자도 포함하여 매치하고 싶다면 re.DOTALL 또는 re.S 옵션을 사용해 정규식을 컴파일.

IGNORECASE(I) - 대소문자에 관계없이 매치할 수 있도록 한다.

MULTILINE(M)  - 여러줄과 매치할 수 있도록 한다. (^, $ 메타문자의 사용과 관계가 있는 옵션이다) ^는 문자열의 처음을 의미하고, $은 문자열의 마지막을 의미. 

^python인 경우 문자열의 처음은 항상 python으로 시작해야 매치. python$이라면 문자열의 마지막은 항상 python으로 끝나야 매치.

VERBOSE(X)    - verbose 모드를 사용할 수 있도록 한다. (정규식을 보기 편하게 만들수 있고 주석등을 사용할 수 있게된다.)

  9. 백슬래시 문제

  10. 메타문자

    | : "or"의 의미와 동일하다. A|B 라는 정규식이 있다면 이것은 A 또는 B라는 의미.

^ : 문자열의 맨 처음과 일치함을 의미.

$ : 문자열의 끝과 매치함을 의미.

\A : 문자열의 처음과 매치됨을 의미. 라인과 상관없이 전체 문자열의 처음하고만 매치.

\Z : 문자열의 끝과 매치됨을 의미. 전체 문자열의 끝과 매치.

\b : 단어 구분자(Word boundary).단어는 whitespace에 의해 구분/

\B : whitespace로 구분된 단어가 아닌 경우에만 매치.

  11. 그룹핑 : 그룹을 만들어 주는 메타문자는 바로 (과 ).

    group(0) : 매치된 전체 문자열

    group(1) : 첫 번째 그룹에 해당되는 문자열

    group(2) : 두 번째 그룹에 해당되는 문자열

    group(n) : n 번째 그룹에 해당되는 문자열

  12. 그룹핑된 문자열 재참조하기

    한번 그룹핑된 문자열을 재참조(Backreferences)할 수 있다.

(\b\w+)\s+\1은 (그룹1) + " " + "그룹1과 동일한 단어" 와 매치됨을 의미.

재 참조 메타문자인 \1이다. \1은 정규식의 그룹중 첫번째 그룹을 지칭.(\2는 두번재 그룹)

  13. 그룹핑된 문자열에 이름 붙이기

    그룹을 인덱스가 아닌 이름(Named Groups)으로 참조.

(\w+) --> (?P<name>\w+)

  14. 전방 탐색(Lookahead Assertions) 

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

.*[.]([^b].?.?|.[^a]?.?|..?[^t]?)$

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

.*[.](?!bat$).*$

  15. 문자열 바꾸기

    sub 메서드를 이용하면 정규식과 매치되는 부분을 다른 문자로 쉽게 바꿀 수 있다.

바꾸기 횟수를 제어하려면 다음과 같이 세 번째 입력 인수로 count 값을 넘기면 된다.

subn 역시 sub와 동일한 기능을 하지만 리턴되는 결과를 튜플로 리턴한다는 차이가 있다. 리턴된 튜플의 첫 번째 요소는 변경된 문자열이고, 두 번째 요소는 바꾸기가 발생한 횟수이다.

  16. sub 메서드 사용 시 참조 구문 사용하기

  17. sub 메서드의 입력 인수로 함수 넣기

  18. Greedy vs Non-Greedy



'Python_Beginer > Note' 카테고리의 다른 글

Python 분석 방법  (0) 2019.03.03
Python 수강 노트 4  (0) 2019.02.24
Python 수강 노트 3  (0) 2019.02.23
Python 수강 노트 2  (0) 2019.02.23
Python 수강 노트 1  (0) 2019.02.23
190222>NeoSmartNote  (0) 2019.02.22