Python

정규표현식(2) [Python]

JEO96 2022. 11. 17. 16:59
반응형

 

 

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