정규 표현 식 양사 와 탐욕의 사용 에 대한 상세 한 설명

0.앞 에 쓴다
이전 글에서 우 리 는 정규 적 인 기초 원 문 자 를 배 웠 습 니 다.모두 가 잊 어 버 린 차이 가 많 지 않 을 것 이 라 고 믿 습 니 다.위의 링크 를 클릭 하여 다시 복습 할 수 있 습 니 다.
오늘 우 리 는 정규 중량사 의 세 가지 일치 모델 을 배 워 보 자.탐욕 모델,비 탐욕 모델,독점 모델 이다.이런 모델 들 은 정규 중량사 의 일치 행 위 를 바 꿀 것 이다.매번 에 탐욕 이 더 많이 일치 하 는 것 일 까?아니면 탐욕 이 좋 은 것 을 보면 받 아들 이 는 것 일 까?이런 것들 을 이해 하지 못 하면 우리 가 쓴 정 도 는 잘못된 것 일 수 있다.심각 한 온라인 성능 문 제 를 일 으 킬 수도 있다.
1.양사
이 글 에서 말 한 내용 과 양사 의 관 계 는 비교적 밀접 하 므 로 먼저 돌 이 켜 보 자.
量词
우 리 는{m,n}의 방식 으로*+를 표시 할 수 있 습 니까?이 세 가지 메타 문자:
문자
동의 표시 방법
예시
*
{0,}
ab*
일치 가능
a 또는 abb
+
{1,}
ab+
일치 가능
ab 혹은 abb
일치 하지 않 음 a
?
{0,1}
ab?
a 또는 ab 와 일치 할 수 있 습 니 다.
abb 와 일치 할 수 없습니다.
2.탐욕 모드 프 리 퀄
정규 에서 횟수 를 나타 내 는 양 어 는 기본적으로 탐욕 입 니 다.탐욕 모드 에서 가능 한 한 목표 문자열 과 최대한 일치 합 니 다.우 리 는 정규 a+a*로 문자열 aaabb 와 일치 하 는 것 을 테스트 합 니 다.
2.1 a+를 사용 하여 매 칭
결과
a+匹配
대응 하 는 Python 코드 는 다음 과 같 습 니 다.

import re

print(re.findall(r'a+', 'aaabb'))

  :['aaa']
2.2 a*를 사용 하여 일치
4 개의 결과 가 일치 하 는 것 을 볼 수 있 습 니 다.그 중 3 개 는 빈 문자열 입 니 다.
a*匹配.jpg
대응 하 는 Python 코드 는 다음 과 같 습 니 다.

import re

print(re.findall(r'a*', 'aaabb'))

  :['aaa', '', '', '']
왜 빈 문자열 과 일치 합 니까?별표(*)는 0 에서 여러 번 일치 하기 때문에 0 번 일치 하면 빈 문자열 입 니 다.그 앞 에 aa 가 있 습 니 다.왜 aa 사이 의 빈 문자열 이 일치 하지 않 습 니까?
이것 은 바로 우리 가 오늘 말 하고 자 하 는 탐욕 모델 과 비 탐욕 모델 에 도입 되 었 다.말 그대로 이해 하기 쉽다.탐욕 모델 은 가능 한 한 많은 일치 이 고 비 탐욕 모델 은 가능 한 한 적은 일치 이다.
3.탐욕 모드
위의 정규 a*의 일치 과정 을 분석 해 보 자.
문자열
a
a
a
b
b
빈 문자열
아래 표
0
1
2
3
4
5
매 칭
시작 하 다
끝나다
설명 하 다.
일치 하 는 내용
처음
0
3
첫 번 째 알파벳 b 에서 일치 하지 않 음 을 발견 하면 aaa 를 출력 합 니 다.
aaa
두 번 째
3
3
남 은 bb 와 일치 합 니 다.일치 하지 않 는 빈 문자열 을 출력 합 니 다.
빈 문자열
세 번 째
4
4
남 은 b 와 일치 합 니 다.일치 하지 않 는 빈 문자열 을 출력 합 니 다.
빈 문자열
네 번 째
5
5
남 은 빈 문자열 과 일치 하여 빈 문자열 을 출력 합 니 다.
빈 문자열
a*문자열 aaabb 와 일치 할 때 앞의 a 를 가능 한 한 많이 일치 시 킵 니 다.첫 번 째 자모 b 가 요 구 를 만족 시 키 지 못 할 때 까지 3 개의 a 와 일치 합 니 다.그 다음 에 일치 하 는 것 은 빈 문자열 입 니 다.
이 를 보면 탐욕 모델 에 대해 더욱 깊 은 인상 을 가지 게 되 었 다 고 믿 습 니 다.탐욕 모델 의 특징 은 가능 한 한 최대 길이 로 일치 하 는 것 입 니 다.바로 얼마 가 필요 한 지 입 니 다.다음은 우리 가 함께 그것 과 완전히 반대 되 는 일치 모델 을 살 펴 보 겠 습 니 다.
4.비 탐욕 모드
위 에서 탐욕 모델 을 말 했 습 니 다.탐욕 모델 은 가능 한 한 최대 길이 로 일치 하 는 것 입 니 다.비 탐욕 모델 은 가능 한 한 최소 길이 로 일치 하 는 것 입 니 다.양사 뒤에 물음표(?)를 추가 하 는 것 입 니 다.비 탐욕 모델 이 되 었 습 니 다.예 를 들 어 a*?
非贪婪匹配
대응 하 는 Python 코드 는 다음 과 같 습 니 다.

import re

//     
print(re.findall(r'a*', 'aaabb'))

  :['aaa', '', '', '']

//      
print(re.findall(r'a*?', 'aaabb'))

  :['', 'a', '', 'a', '', 'a', '', '', '']
탐욕 모드 와 비 탐욕 모드 를 배 웠 습 니 다.제 가 어떤 상황 에서 사용 할 수 있 는 지 물 어 볼 수 있 습 니 다.다음은 밤 을 들 어 느끼 세 요.
贪婪匹配例子
非贪婪匹配例子
필요 한 것 은 문자열 에서 모든 따옴표 가 포 함 된 내용 을 찾 는 것 입 니 다.그 위 에 탐욕 과 비 탐욕 이 일치 하 는 대 비 를 사용 하면 차이 가 현저 합 니 다.그 렇 죠?
5.독점 모드
탐욕 모델 이 든 비 탐욕 모델 이 든 일치 하 는 과정 에서 역 추적 이 있어 야 원 하 는 기능 을 완성 할 수 있 습 니 다.그러나 일부 장면 에서 우 리 는 역 추적 할 필요 가 없습니다.일치 하지 않 으 면 바로 실패 로 돌아 가면 됩 니 다.따라서 정규 일치 에는 또 다른 모델 이 있 습 니 다.독점 모델 은 탐욕 모델 과 비슷 하지만 일치 하 는 과정 에서 역 추적 이 발생 하지 않 습 니 다.일부 사용 장면 에서 성능 이 더욱 좋 을 것 이다.
먼저 역 추적 이 무엇 인지 이야기 하고 밤 을 들 어 보 세 요.정규 표현 식 과 목표 문자열 이 있 습 니 다.우 리 는 세 가지 일치 모드 에서 무슨 일이 일 어 났 는 지 살 펴 보 겠 습 니 다.
5.1 탐욕 매 칭 과정
정규 표현 식:ab{1,3}c
대상 문자열:abbc
일치 할 때 b{1,3}은 가능 한 한 길 게 목표 문자열 과 일치 합 니 다.abb 와 일치 한 후에 가능 한 한 긴 일치(3 개 b)를 해 야 하기 때문에 목표 문자열 의 c 가 일치 하지 않 습 니 다.이 때 는 앞으로 거 슬러 올 라 가 현재 문자 c 를 뱉 고 정규 c 로 일치 합 니 다.일치 합 니 다.
贪婪匹配过程

import regex

print(regex.findall(r'ab{1,3}c', 'abbc'))

  :['abbc']
5.2 비 탐욕 매 칭 과정
정규 표현 식:ab{1,3}?c
대상 문자열:abbc
일치 할 때 b{1,3}은 가능 한 한 짧게 목표 문자열 과 일치 합 니 다.ab 와 일치 한 후에 정규 c 로 목표 문자열 의 남 은 b 와 일치 하지 않 습 니 다.일치 하지 않 습 니 다.앞으로 거 슬러 올 라 갑 니 다.정규 b{1,3}으로 목표 문자열 의 남 은 b 와 일치 한 다음 정규 c 로 목표 문자열 의 남 은 c 와 일치 합 니 다.일치 합 니 다.
非贪婪匹配过程

import regex

print(regex.findall(r'ab{1,3}?c', 'abbc'))

  :['abbc']
5.3 독점 매 칭 과정
양사 뒤에+를 더 하면 독점 모델 이다.
정규 표현 식:ab{1,2}+bc
대상 문자열:abbc
일치 할 때 b{1,2}는 가능 한 한 길 게 목표 문자열 과 일치 합 니 다.abb 와 일치 한 후에 정규 b 로 목표 문자열 의 나머지 c 와 일치 합 니 다.일치 하지 않 고 거 슬러 올 라 가지 않 으 며 일치 하지 않 습 니 다.
独占匹配过程

import regex

print(regex.findall(r'ab{1,2}+bc', 'abbc'))

  :[]
6.마지막 에 쓴다
마지막 으로 위 에서 말 한 내용 을 요약 한다.
思维导图
여기까지 정규 표현 식 의 양사 와 탐욕 은 끝 났 습 니 다.문제 가 있 으 면 댓 글 을 남 겨 주세요.감사합니다.
정규 표현 식 온라인 검사 도구:https://regex101.com/
정규 표현 식 양사 와 탐욕의 사용 에 관 한 상세 한 글 은 여기까지 소개 되 었 습 니 다.더 많은 정규 표현 식 양사 와 탐욕의 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기