반응형
import re
pat = r'\d{1,3}(,\d{3})*(\.\d*)?'
lst = re.findall(pat, '12,000 monkeys on 55.5 cats.')
print(lst)
# 출력
# [(',000', ''), ('', '.5')]
역추적, 탐욕적 수량자와 게으른 수량자
정규표현식 예시
import re
pat1 = r'(\w|[@#$%^&*!]){8,}$' # 문자와 언더스코어, @#$%^&*! 중 하나를 허용하며, 8개의 문자를 요구한다.
pat2 = r'.*\d' # 0개부터 여러 개의 문자와 일치한 후 하나의 숫자와 일치한다.
pat3 = r'.*[a-zA-Z]' # 0개부터 여러 개의 문자와 일치(.*)한 후 대문자 혹은 소문자 글자와 일치한다.
pat4 = r'.*[@#$%^$*]' # 마지막 패턴은 0개 혹은 어러 개 문자와 일치한 후 범위 @#$%^%*! 안의 한 문자와 일치한다.
def verify_passwd(s):
b = (re.match(pat1, s) and re.match(pat2, s) and
re.match(pat3, s) and re.match(pat4, s))
return bool(b)
Match 객체 사용하기
import re
pat = r'(a+)(b+)(c+)'
m = re.math(pat, 'abbcccee')
print(m.group(0)) # abbccc
print(m.group(1)) # a
print(m.group(2)) # bb
print(m.group(3)) # ccc
- group(0)은 정규표현식 패턴에 일치한 전체 텍스트를 반환한다.
- group(n)에서 n은 1부터 시작하며, 소괄호 기호로 나누어진 그룹에 일치하는 그룹을 순서대로 반환한다. 첫 번째 그룹은 group(1)로 접근할 수 있고, 두 번째 그룹은 group(2)로 접근이 가능하며, n번째 그룹은 group(n)으로 접근할 수 있다.
match 객체의 또 다른 속성은 lastindex다. 이 속성은 일치 유무를 판단하여 반환한 그룹 중 마지막 그룹의 숫자를정수로 보관한다. 앞에서 살펴본 예시는 다음과 같이 평버한 루프로 작성할 수 있다.
import re
pat = r'(a+)(b+)(c+)'
m = re.match(pat, 'abbcccee')
for i in range(m.lastindex + 1):
print(i, '. ', m.group(i), sep='')
# 출력
# 0. abbccc
# 1. a
# 2. bb
# 3. ccc
match 객체 속성
구문 | 설명 |
group(n) | 특정 그룹에 속한 테스트를 반환한다. 그룹은 1부터 시작한다. 기본값 0은 일치한 전체 문자열의 텍스트를 반환한다. |
groups() | 일치한 모든 텍스트를 담고 있는 그룹들을 나열한 튜플이 반환된다. 첫 번째 하위 그룹인 그룹 1부터 시작한다. |
groupdict() | 이름이 있는 모든 그룹으로 구성된 딕셔너리를 반환한다. 포맷은 '이름:텍스트'다. |
start(n) | 대상 문자열 안에서 n으로 참조할 수 있는 그룹의 시작 지점을 반환한다. 문자열 안의 위치는 0부터 시작하지만 그룹 숫자는 1부터 시작한다. 따라서 start(1)은 첫 번째 그룹의 문자열 색인 시작 지점을 반환한다. start(0)은 모든 일치 텍스트의 문자열 색인 시작 지점을 반환한다. |
end(n) | start(n)과 비슷하지만 end(n)은 전체 대상 문자열에 식별된 그룹의 종료 지점을 가져온다. 이 문자열 안에는 대상 문자열의 '시작' 색인부터 시작하여 '종료' 색인 바로 전까지의 모든 문자를 지니고 있다. 가령 시작과 종료 값이 0과 3이면 첫 3개의 문자가 패턴과 일치한다는 의미다. |
span(n) | start(n)과 end(n)이 제공하는 정보를 튜플로 반한한다. |
lastindex | 그룹 중 가장 높은 색인 숫자 |
패턴에 맞는 문자열 검색
re.search는 전체 문자열이 아니라, 패턴에 맞는 부분이 있는지를 확인한다.
일치_객체 = re.search(패턴, 대상_문자열, flags=0)
이 문법에서 '패턴'은 정규표현식 패턴인 문자열이거나 사전에 컴파일된 정규표현식 객체가 될 수 있다. '대상_문자열'은 검색 대상 문자열이다. flags 인수는 선택 사항이며, 기본값은 0이다.
이 함수로 일치하는 부분을 찾으면 match 객체를 반환하며, 그렇지 않은 경우 None을 반환한다. 이 함수는 re.match와 동작 방식이 비슷하지만 문자열의 시작 부분이 패턴과 일치할 필요는 없다.
예를 들어 다음 코드는 두 자릿수 이상의 문자가 처음으로 나타나는 지점을 찾는다.
import re
m = re.search(r'\d{2,}', '1 set of 23 owls, 999 doves.')
print(f'"{m.group()}" found at {m.span()}')
# "23" found at (9, 11)
반복하여 검색하기(fileall)
특정 패턴과 일치하는 모든 부분 문자열을 찾는것은 일반적인 검색 작업이다. 이 작업은 모든 검색 결과를 파이썬 리스트로 반환하는 함수를 제공하기 때문에 그리 어렵지 않다.
리스트 = re.fileall(패턴, 대상_문자열, flags=0)
이 문법에서 인수 대부분은 앞 절에서 다룬 것과 같다. '패턴'은 정규표현식 문자열이나 사전 컴파일된 객체이고, '대상_문자열'은 검색할 문자열이며, flags는 선택 사항이다.
import re
s = '1 set of 23 owls, 999 doves.'
print(re.findall(r'\d+', s))
# 출력
# ['1', '23', '999']
s = 'I do not use sophisticated, multisyllabic words!'
print(re.findall(r'\w{6,}', s))
# 출력
# ['sophisticated', 'multisyllabic']
import re
s = '12 15+3 100-*'
print(re.findall(r'[+*/-]|\w', s))
# 출력
# ['12', '15', '+', '3', '100', '-', '*']
정규표현식의 문제점
소괄호에 일치하는 각각의 패턴에 일치하는 문자열을 담은 부분들을 반환함
import re
s = 'What is 1,000.5 times 3 times 2,000?'
print(re.findall(r'\d[0-9,.]*', s))
# 출력
# ['1,000.5', '3', '2,000']
import re
pat = r'(\d{1,3}(,\d{3})*(\.\d*)?)'
lst = re.findall(pat, '12,000 monkeys on 55.5 cats.')
for item in lst:
print(item[0])
# 출력
# 12,000
# 55.5
반응형
'Python' 카테고리의 다른 글
정규표현식(3) [Python] (0) | 2022.11.28 |
---|---|
정규표현식(1) [Python] (0) | 2022.11.16 |
리스트 복사 vs 리스트 변수 복사, 얕은 복사 vs 깊은 복사 (0) | 2022.11.15 |
str 불리언(is) 메서드[Python] (0) | 2022.11.11 |
set(세트)[Python] (0) | 2022.11.11 |