코드스테이츠(컴퓨터 공학 기본)(Computer Science) Session 5 / Sprint 1(정규표현식)

나이브한코딩·2021년 7월 10일
0
post-thumbnail

학습 목표 :

  • 파이썬의 다양한 함수, 반복문, 조건문에 익숙해지기
  • 다양한 메소드에 대해 내부로직을 분석하고 활용하기
  • 컬렉션 자료형(리스트, 튜플, 세트, 딕셔너리) 에 익숙해지기
  • 현실상황을 사칙연산을 이용하여 프로그래밍하는 방법 익히기
  • 최종 목적은 "자료구조" 와 "알고리즘" 을 이해하며 프로그래밍하기

핵심 키워드 :

  • "문제 해결" 과 "컴퓨팅 사고력"

프로그래밍과 문제해결:

  • 현실에서 발생하는 복잡한 문제를 작은 문제로 "분할" 하면서 해결한다.
  • 문제에 대한 "패턴"을 발견한다.
  • 최소한의 비용 / 최대한 빠르게 해결

개념 용어 정리:

  • 파이썬 : 컴퓨터와의 소통언어
  • 알고리즘 : 효율적인 문제해결방법
  • 자료구조 : 프로그램의 구조와 크기(수학 문제들 간의 관계와 난이도)

Session 5 기본 내용들을 정리해 보겠다.

정규표현식은:

  • 텍스트에서 우리가 원하는 특정한 패턴을 찾을 때 아주 유용하게 사용됨.
  • 예로 많은 텍스트 중에 전화번호 및 웹사이트 URL 주소 등을 찾고자 할 때 쓰임.
  • 사용자가 입력한 아이디나 패스워드가 특정한 패턴을 부합하는지 유효성 검사할 때 쓰임.
  • 1950년 Steven Cole 이 발명.
  • slash(/) 를 이용하여 우리가 찾고자 하는 패턴을 작성해주면 됨.
  • 정규표현식은 데이터를 분석하기 전 데이터 구분을 위해 많이 활용됨.
  • 데이터 분석/ 엔지니어링/ 데이터 사이언스/ 웹개발 등 분야에 따라 쓰이는 메소드가 다름.
  • 정규표현식은 특정한 프로그밍언에 종속되지 않고 쓰임. 범용적으로 활용됨.

문법 정리: * 크게 4가지

1. Groups and ranges
Chracter 뜻
| : 또는
( ) : 그룹 (매치도 되고 그룹 1은 Hi 로 지정됨) 예) grey 중 gr(e|a)y(e 또는 a 문자열을 가진 y로 끝나는 단어를 찾고싶다.
[ ] : 문자셋, 괄호안의 어떤 문자든 예) gr[aed]y 하나라도 만족하는 것을 찾아라.
[^] : 부정 문자셋, 괄호안의 어떤 문가 아닐때 예) gr[^aed]y "aed"를 제외한 나머지를 찾아라.
(?:) : 찾지만 기억하지는 않음

2. Quantifiers
Chracter 뜻
? : 없거나 있거나 (zero or one) 예) gra?y : a가 있는거 또는 없는거 다 찾는다.
* : 없거나 있거나 많거나 (zero or more) : 예) gra*y : a 가 있거나 없가나 많거나.
+ : 하나 또는 많이 (one or more) : 예) gra+y : a가 하나 또는 많이
{n} : n번 반복 예) gra{2}y : a가 2번 나오는 단어 선택.
{min,} : 최소 예) gra{2,}y : a가 최소 2번 나오는 단어 선택.
{min,max} : 최소, 그리고 최대 예) gra{2,4}y : a가 최소 2번 최대 4번 나오는 것.

3. Boundary-type
Chracter 뜻
\b : 단어 경계 예) \bYa : 단어 앞에서 쓰이는 "Ya" 만 찾는다. 반대로 Ya\b.
\B : 단어 경계가 아님 예) Ya\B : Ya가 단어 뒤에서 쓰이지 않는 것만 찾는다.
^ : 문장의 시작 예) ^Ya : 문장에서 시작하는 Ya를 선택.
$ : 문장의 끝 예) $Ya : 문장에서 끝에 있는 Ya 를 선택.

4. Character classes
Chracter 뜻
** : 특수 문자가 아닌 문자
. : 어떤 글자 (줄바꿈 문자 제외)
\d : digit 숫자
\D : digit 숫자 아님
\w : word 문자
\W : word 문자 아님
\s : space 공백
\S** : space 공백 아님

Match 객체의 메서드 :
1) group( ) : 매치된 문자열을 리턴한다.
2) start( ) : 매치된 문자열의 시작 위치를 리턴한다.
3) end( ) : 매치된 문자열의 끝 위치를 리턴한다.
4) span( ) : 매치된 무낮열의 (시작, 끝) 에 해당하는 튜플을 리턴한다.

import re
p = re.compile('[a-z]+')
m = re.match('python')
print(m.group())  # python 매치된 문자열
print(m.start())  # 0 첫 시작 인덱스
print(m.end())  # 6 끝 인덱스
print(m.span())  # (0.6) 시작과 끝 인덱스를 튜플 형식으로 반환

예시)

* import re(regular expression)
p = re.compile('[a-z]+')
a~z 까지 문자가 한 번 이상 반복되는걸 찾아라.
*** p: 패턴객체

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

Method: 목적

  1. match(): 문자열의 처음부터 정규식과 매치되는지 조사한다.

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

  3. findall(): 정규식과 매치되는 모든 문자열(substring)을 리스트로 돌려준다.

  4. finditer(): 정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 돌려준다.

import re
p = re.compile('[a-z]+') # a~z 까지 한 번 이상 반복되는 것을 찾기.
m = p.match('3 python') # 3 는 a~z 에 없음. 매치 안될 경우 "None"이 나옴.
m = p.search('3 python') # 첫번째가 꼭 일치하지 않아도, 일치하는 구문이 있으면 일치하는 것을 찾아줌.
m = p.findall('life is too short') # 일치하는 것을 찾아서 리스트로 return
m = p.finditer('life is too short') # 일치하는 것을 찾아서 iterator object 로 return. 매치 되는 문자열을 다 match 객체 형태로 반복가능한 형태로 반환.
print(m)

컴파일 옵션: 컴파일 할 때 옵션을 주는 방법.

1) DOTALL, S:

import re
p = re.compile('a.b') # . 이 들어가면 줄바꿈으 제외한 모든 문자 매치.
m = p.match('a\nb')
print(m)
import re
p = re.compile('a.b', re.DOTALL) # 실행했을 때 줄바꿈 문자가 있어도 객채가 매칭되서 나옴. 즉 줄바꿈 문자도 포함하라는 명령어.
m = p.match('a\nb')
print(m)

2) IGNORECASE, I:

import re
p = re.compile('[a-z]')
print(p.match('python')) # 소문자로 매칭이 됨
print(p.match('Python')) # 매칭 안 됨
print(p.match('PYTHON')) # 매칭 안 됨
import re
p = re.compile('[a-z]', re.I) # 대소문자 다 매칭해준다.
print(p.match('python')) # 소문자로 매칭이 됨
print(p.match('Python')) # 매칭 됨
print(p.match('PYTHON')) # 매칭 됨

3) MULTILINE, M:

import re
p = re.compile("^python\s\w+") # 꺽새는 맨 처음에 파이썬이 나오는 단어 찾아라. 그 뒤에 공백 그리고 단어가 반복되는 문자를 찾아라.

data = """python one
life is too short
python two
you need python
python three"""

print(p.findall(data)) # python one 만 반환.
import re
p = re.compile("^python\s\w+, re.M") # 이러면 3개 다 반환. 다 새로운 줄의 맨 처음으로 인식해서 결국 다 반환하는 것.

data = """python one
life is too short
python two
you need python
python three"""

print(p.findall(data)) # python one, two, three 다 반환.

4) VERBOSE, X :

import re
charref = re.compile(r'&[#](0[0-7]+|[0-9]+|x[0-9a-fA-F]+);') # 이렇게 긴 정규표현식이 있을 때 나눠서 볼 수 있게 만드는 옵션. 알아보기 쉽게 띄어쓰기로 나눌 수 있음.

charref = re.compile(r"""
&[#]
(
	0[0-7]
    |[0-9]
    |x[0-9a-fA-F]+
)
;
""", re.VERBOSE)

느낀점) 정규표현식에 대해서 알아보았다. 물론 깊게 들어가면 더 많은 부분을 배워야겠지만 지금 당장은 이 정도도 충분한 것 같다. 열공하자!

profile
안녕하세요, 코딩 공부하는 비전공자 취준생입니다.

0개의 댓글