Web-Programming School 1월 22일 수업
본 문서는 패스트캠퍼스 ‘Web-Programming School’ 수업 자료를 바탕으로 작성되었습니다.
개인적으로 너무 힘들어 했던 부분 ㅜㅜ
특정한 패턴에 일치하는 복잡한 문자열 을 처리할 때 사용하는 기법
파이썬에서는 표준 모듈 re
를 사용해서 정규표현식을 사용할 수 있음
import re
를 꼭 넣어줘야 한다!
정규표현식의 패턴 문자
패턴 | 문자 | 다른표현 |
---|---|---|
\d | 숫자 | [0-9] |
\D | 비숫자 | [^0-9] |
\w | 문자 | [a-zA-Z0-9] |
\W | 비문자 | [^a-zA-Z0-9] |
\s | 공백문자 | [\t\n\r\f\v] |
\S | 비공백 문자 | [^\t\n\r\f\v] |
\b | 단어 경계 | - |
\B | 비단어경계 | - |
정규표현식의 패턴 지정자
패턴 | 의미 |
---|---|
abc | 리터럴 abc |
(expr) | expr |
expr1ㅣexpr2 | expr1 또는 expr2 |
. | \n을 제외한 모든 문자 |
^ | 소스문자열의 시작 |
$ | 소스문자열의 끝 |
expr? | 0 또는 1회의 expr |
expr* | 0회 이상의 최대 expr |
expr*? | 0회 이상의 최소 expr |
expr+ | 1회 이상의 최대 expr |
expr+? | 1회 이상의 최소 expr |
expr{m} | m회의 expr |
expr{m,n} | m에서 n회의 최대 expr |
expr{m,n}? | m에서 n회의 최소 expr |
[abc] | a or b or c |
[^abc] | not (a or b or c) |
expr1(?=expr2) | 뒤에 expr2가 오면 expr1에 해당하는 부분 |
expr1(?!expr2) | 뒤에 expr2가 오지 않으면 expr1에 해당하는 부분 |
(?<=expr1)expr2 | 앞에 expr1이 오면 expr2에 해당하는 부분 |
(?<!expr1)expr2 | 앞에 expr1이 오지 않으면 expr2에 해당하는 부분 |
match 객체의 메서드
match : 시작부터 일치하는 패턴 찾기
문자열의 처음부터 정규식과 일치하는지 확인 (만약 처음부터 같지 않다면, 정규식을 찾지 못 함)
import re
lux = 'Lux, the Lady of Luminosity'
result = re.match('Lux', lux)
search : 첫 번째 일치하는 패턴 찾기
문자열 전체에서 일치하는 부분을 찾을 때 사용
m = re.search('Lady', lux)
if m:
print(m.group())
findall : 일치하는 모든 패턴 찾기
정규식과 일치하는 모든 문자열을 리스트로 리턴
finditer : 일치하는 모든 패턴 찾기
정규식과 일치하는 모든 문자열을 반복 가능한 (iterator)객체로 리턴 반복 가능한 객체가 포함하는 각가의 요소는 match객체
split : 패턴으로 나누기
문자열의 split() 메서드와 비슷하지만 패턴을 사용할 수 있다.
sub : 패턴 대체하기
문자열의 replace()메서드와 비슷하지만 패턴을 사용할 수 있다.
매칭 결과 그룹화
정규표현식 패턴 중 괄호()로 둘러싸인 부분이 있을 경우, 결과는 괄호만 그룹으로 저장
Match 객체의 group()
함수는 매치된 전체 문자열 을 리턴
groups()
함수는 지정된 그룹 리스트 를 리턴
(?P
#group() = group(0)
s = re.search(r'\w+\w(was)', story)
s.groups()
s.group(0)
s.group(1)
#매칭된 표현식 그룹에 이름을 붙여 사용 가능
m = re.search(r'(?P<before>\w+)\s+(?P<was>was)\s+(?P<after>\w+)', story)
m.groups()
m.group('before')
m.group('was')
m.group('after')
compile()
패턴을 컴파일하여 정규식 객체를 반환
p = re.compile(r'\w.*')
raw string = r’’
이스케이프 문자열을 표현하기 위해 (백슬래쉬) 를 사용하는데, 문자 ‘'를 정규표현식으로
표현하기 위해선 ‘\\‘로 표현해야한다. 이를 좀 더 편리하게 하기 위해 raw string 표기법 사용
문자열 앞에 r 을 더한 것으로, ‘'를 이스케이프 문자열로 처리하지 않고 일반 문자로 동일 처리
컴파일 옵션
- DOTALL(S) -
.
이 줄바꿈 문자를 포함하여, 모든 문자와 매치,
여러줄로 이루어진 문자열에서\n
에 상관없이 검색 - IGNORECASE(I) - 대소문자에 관계없이 매치
- MULTILINE(M) - 여러 줄 매치
실습 {m}패턴지정자를 사용해서 a로 시작하는 4글자 단어를 전부 찾는다.
m = re.compile(r'\ba\w{3}\b')
print(m.findall(story))
실습 r로 끝나는 모든 단어를 찾는다.
m = re.compile(r'\w+r\b')
print(m.findall(story))
실습 a,b,c,d,e중 아무 문자나 3번 연속으로 들어간 단어를 찾는다. ex) b[eca]me
m = re.compile(r'\w*[abcde]{3}\w*')
print(m.findall(story))
실습 re.sub를 사용해서 ,로 구분된 앞/뒤 단어에 대해 앞단어는 대문자화 시키고, 뒷단어는 대괄호로 감싼다. 이 과정에서, 각각의 앞/뒤에 before, after그룹 이름을 사용한다.
a = re.compile(r(?P<before>'w+')\s*,\s*(?P<after>\w+))
def sub_function(match_object):
return f'{match_object.group("before").upper()},[{match_object.group("after")}]'
s2 = re.sub(a,sub_function,story)
print(s2)
더 많은 실습 자료들이 필요하면
정규표현식 예제 사이트