[SK Shieldus Rookies 16기] 클라우드 기반 스마트 융합 보안(4일차)
인프라 활용을 위한 파이썬
- 문자열을 다루는 도구
- 정규식을 사용하지 않는 것이 더 좋은 경우
* 길이 (Length)
* 비교 (Compare)
* 추출 (Extract)
* 접합 (Concetenation)
* 자르기 (Tokenization)
- 정규식을 사용하는 경우
* 사용자 입력 유효성 검증 : e-mail 주소, URL, 전화번호, 주민번호 등
* 패턴에 기반한 감지 및 치환 : SQL Injection 탐지, HTML 태그 및 악성스크립트 제거
기본 문법
메타문자 | 기능 | 설명 |
. | 모든 문자 | 1개의 문자와 일치, 단일행 모드에서는 개행 문자는 제외 |
[ ] | 문자 클래스 | [ ]괄호 안의 문자중 하나를 선택, [1-9] [a-z] 처럼 '-' 를 쓰면 범위를 지정함 |
[^ ] | 부정 | 문자 클래스 안의 문자를 제외한 나머지를 선택 |
^ | 처음 | 문자열의 처음, 즉 시작을 의미함 |
$ | 끝 | 문자열의 끝, 마지막을 의미함 |
( ) | 하위식(Gruoup) | 여러 식을 하나로 묶을 수 있음 |
* | 0회 이상 | 0개 이상의 문자를 포함 / a*b는 ab, aab, aaab를 포함 |
{m, n} | m회 이상 n회 이하 | a{1,3}b는 ab, aab, aaab는 포함하지만 aaaab는 안됨 |
? | 0또는 1회 | a?b는 b, ab를 포함 |
+ | 1회 이상 | a+b는 ab,aab,aaab는 포함하지만 b는 안됨 |
| | 선택(or) | 여러 식 중 하나를 선택함 |
이스케이프(escape)
정규식에서 메타문자를 실제 문자열의 특수문자로 나타내기 위해서는 백슬래시(\)를 붙여 문자 그대로 해석되도록(이스케이프) 할 수 있다. 예를 들어 확장자를 찾아야 할 때 aab.jpg에서 마침표를 찾고 싶다면 정규식에는 \. 백슬래시를 붙여 표현해야 한다. 괄호들을 포함한 메타문자를 그 자체로 찾기 위해서는 \[ \] \( \) 이와 같이 사용한다.
공백 메타 문자
메타문자 | 설명 |
[\b] | Backspace |
\b | 단어의 경계. |
\B | \b의 반대. 문자와 문자의 사이 |
\f | Form feed |
\v | Vertical tab |
\t | Tab |
\r | Carriage return |
\n | Line feed |
\s | \b를 제외한 상단의 모든 공백 |
\S | \s의 부정(= [^\f\n\r\t\v] ) |
문자 클래스
\d | 모든 숫자(= [0-9] ) |
\D | \d의 부정(= [^0-9] ) |
\w | 알파벳 대소문자, 숫자, 언더바(= [A-Za-z0-9_] ) |
\W | \w의 부정 (= [^A-Za-z0-9_] ) |
탐욕적 수량자 / 게으른 수량자
- 탐욕적 수량자(Greedy Match)
패턴 매칭이 중간에 멈추지 않고 끝까지 찾는 수량자이다. 일반적인 수량자는 탐욕 수량자이다.
- 게으른 수량자(Lazy, Non-greedy Match)
패턴을 발견하는 즉시 매칭 작업이 종료되는 수량자이다. 뒤에 매칭되는 패턴이 있더라도 멈춘다.
예제
compile함수로 정규식 패턴을 만들 수 있다.
search 함수는 패턴과 일치하는 맨앞의 문자를 찾는다.
match함수는 맨 앞부터 일치해야 한다
findall함수는 일치하는 모든 패턴을 찾아 리스트로 반환한다.
\b 는 단어를 구분하는 공백이나 특수문자로 나뉜다
*? 게으른 수량자라서 aac패턴을 찾자마자 끝남
* 탐욕적 수량자라서 끝까지 패턴을 매치하여 찾는다.
전화번호를 체크하는 정규식
이메이을 체크하는 정규식
url을 체크하는 정규식
()그룹핑이 되어 있으면 findall함수는 패턴에 맞는 문자열을 튜플로 반환한다. 아래와 같이 이미지 파일 이름과 확장자를 튜플로 받을 수 있다.
text에서 pattern에 해당하는 부분으로 문자열을 나누어 리스트로 반환
text 중 pattern에 해당하는 부분을 replacement로 대체하는 함수
'[SK Shieldus Rookies 16기] > Python' 카테고리의 다른 글
문자열 처리 (1) | 2023.10.31 |
---|---|
얕은 복사(shallow copy) / 깊은 복사(deep copy) (0) | 2023.10.31 |
파이썬 데이터 구조(tuple, dictionary) (0) | 2023.10.30 |
파이썬 데이터 구조(리스트) (0) | 2023.10.26 |
파이썬 함수와 모듈 (0) | 2023.10.26 |