Python 정규 표현 식 튜 토리 얼 의 3:탐욕/비 탐욕 특성

이전에 Python 정규 표현 식기초포획 하 다.을 간단하게 소 개 했 습 니 다.그러면 이 글 에서 정규 표현 식 의 탐욕/비 탐욕 특성 을 정리 하 겠 습 니 다. 
탐 욕 스 럽 다
기본 적 인 상황 에서 정규 표현 식 은 탐욕 과 일치 합 니 다.'탐욕'이란 여러 길이 의 일치 문자열 중에서 비교적 긴 것 을 선택 하 는 것 이다.예 를 들 어 다음 과 같은 정규 표현 식 은 인물 이 하 는 말 을 선택 하 는 것 이지 만'탐욕'특성 으로 인해 일치 하지 않 는 다.

>>> sentence = """You said "why?" and I say "I don't know"."""
>>> re.findall(r'"(.*)"', sentence)
['why?" and I say "I don\'t know']
예 를 들 어 다음 과 같은 몇 가지 예 는 정규 표현 식 인'탐욕'의 특성 을 설명 했다.

>>> re.findall('hi*', 'hiiiii')
['hiiiii']
>>> re.findall('hi{2,}', 'hiiiii')
['hiiiii']
>>> re.findall('hi{1,3}', 'hiiiii')
['hiii']
탐욕 이 아니다
우리 가 정규 표현 식 인'비 탐욕 적'으로 일치 하 기 를 기대 할 때 문법 을 통 해 명확 하 게 설명 해 야 한다. 
      {2,5}?    2-5 회 포획 하지만 우선 횟수 가 적은 매 칭
여기 있 습 니 다.물음표?어 지 러 울 수도 있 습 니 다.그 전에 그 는 자신의 의 미 를 가지 고 있 었 기 때 문 입 니 다.앞의 일치 가 0 번 이나 1 번 나 타 났 기 때 문 입 니 다.사실 물음표 가 부정 확 한 횟수 를 나타 내 는 정규 표현 식 부분 에 나타 나 면 탐욕 과 일치 하지 않 는 다 는 것 을 기억 하 라. 
아니면 위의 몇 가지 예 를 들 어 탐욕 이 아 닌 것 으로 일치 하면 결 과 는 다음 과 같다.

>>> re.findall('hi*?', 'hiiiii')
['h']
>>> re.findall('hi{2,}?', 'hiiiii')
['hii']
>>> re.findall('hi{1,3}?', 'hiiiii')
['hi']
또 다른 예 에서 비 탐욕 매 칭 을 사용 한 결 과 는 다음 과 같다.

>>> sentence = """You said "why?" and I say "I don't know"."""
>>> re.findall(r'"(.*?)"', sentence)
['why?', "I don't know"]
포획 과 비 탐욕
엄 밀 히 말 하면 이 부분 은 탐욕 이 아 닌 특성 이 아니다.그러나 비 탐욕 과 비슷 한 행동 을 하기 때문에 기억 하기 편 하도록 함께 두 었 다. 
      (?=abc) 캡 처,문자 소모 없 이 abc 와 일치 합 니 다.
      (?!abc)포획,소모 하지 않 으 며 abc 와 일치 하지 않 습 니 다.
정규 표현 식 이 일치 하 는 과정 에서'문자 소모'과정 이 존재 합 니 다.즉,한 문자 가 일치 하 는 과정 에서 검색(소모)되면 뒤의 일치 가 이 문 자 를 다시 검색 하지 않 습 니 다. 
이 특성 을 알 면 무슨 소 용이 있 습 니까?예 를 들 어 설명 할 까요?예 를 들 어 문자열 에 한 번 이상 나 온 단 어 를 찾 고 싶 습 니 다.

>>> sentence = "Oh what a day, what a lovely day!"
>>> re.findall(r'\b(\w+)\b.*\b\1\b', sentence)
['what']
이러한 정규 표현 식 은 분명히 임 무 를 완성 할 수 없다.왜 일 까요?그 이 유 는 첫 번 째(\w+)가 what 에 일치 하고 그 다음\1 도 두 번 째 what 에 일치 할 때'Oh what a day,what'라 는 단락 의 문자열 이 정규 표현 식 에 소모 되 었 기 때문에 그 다음 의 매 칭 은 두 번 째 what 이후 부터 시 작 됩 니 다.자 연 스 럽 게 두 번 나 온 단 어 를 찾 을 수 밖 에 없다. 
그러면 해결 방안 은 위 에서 언급 한(?=abc)문법 이 관련 되 어 있 습 니 다.이러한 문법 은 그룹 이 일치 하 는 동시에 문자열 을 소모 하지 않 습 니 다!그래서 정확 한 쓰기 방식 은 다음 과 같다.

>>> re.findall(r'\b(\w+)\b(?=.*\b\1\b)', sentence)
['what', 'a', 'day']
만약 우리 가 적어도 두 개의 다른 자 모 를 포함 하 는 단 어 를 일치 시 켜 야 한다 면(?!abc)의 문법:

>>> re.search(r'([a-z]).*(?!\1)[a-z]', 'aa', re.IGNORECASE)
>>> re.search(r'([a-z]).*(?!\1)[a-z]', 'ab', re.IGNORECASE)
<_sre.SRE_Match object; span=(0, 2), match='ab'>
총결산
이상 은 Python 정규 표현 식 에서 탐욕 에 관 한 모든 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 python 을 사용 하 는 데 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 달 아 주 십시오.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.다음 글 은 Python 정규 표현 식 re 모듈 의 API 사용법 을 계속 정리 하 겠 습 니 다.계속 지 켜 봐 주 십시오.

좋은 웹페이지 즐겨찾기