수량자LOGIN

수량자

자, 계속해서 정규식에 대한 이해를 깊게 하세요. 이 부분에서는 수량자를 이해하고, 수량자를 사용하는 이유에 대해 생각해 보겠습니다. 수십 또는 수백 개의 문자를 일치시키려면 하나씩 작성해야 합니까? 하나이므로 수량자만 나타납니다.

정량어의 어휘는: {min,max}입니다. min과 max는 모두 음이 아닌 정수입니다. 쉼표가 있고 max가 생략된 경우 max에는 제한이 없습니다. 쉼표와 최대값을 모두 생략하면 최소값을 반복합니다. 예를 들어, b[1-9][0-9]{3}b는 1000에서 9999 사이의 숫자와 일치하고("b"는 단어 경계를 나타냄) b[1-9][0-9]{ 2,4} b, 100 ~ 99999 사이의 숫자와 일치합니다.

영어 문자열에서 4~7자를 일치시키는 아래 예를 살펴보겠습니다.

import re
a = 'java*&39android##@@python'
# 数量词
findall = re.findall('[a-z]{4,7}', a)
print(findall)

출력 결과:

['java', 'android', 'python']

여기에는 Greedy와 Non-greedy가 있다는 점에 유의하세요. 그럼 관련 개념을 먼저 살펴보겠습니다:

Greedy 모드: 전체 문자열을 한 번에 읽는 것이 특징입니다. 일치하지 않으면 가장 오른쪽 문자를 뱉은 다음 일치하는 문자열이나 문자열을 찾을 때까지 일치시킵니다. 길이가 0이 될 때까지. 그 목적은 가능한 한 많은 문자를 읽는 것이므로 첫 번째 일치 항목을 읽으면 즉시 반환됩니다.

Lazy 모드: 문자열의 왼쪽부터 시작하여 문자열의 문자를 읽지 않고 일치를 시도하는 것이 특징입니다. 실패하면 한 문자를 더 읽고 다시 일치를 시도합니다. 일치하는 문자열을 찾은 다음 문자열 끝까지 다시 일치합니다.

위의 예는 욕심이 없는 모드, 즉 게으른 모드를 사용하려면 어떻게 해야 할까요?

욕심없는 사용을 원할 경우 ?를 추가하면 위의 예는 다음과 같이 수정됩니다.

import re
a = 'java*&39android##@@python'
# 贪婪与非贪婪
re_findall = re.findall('[a-z]{4,7}?', a)
print(re_findall)

출력 결과는 다음과 같습니다.

['java', 'andr', 'pyth']

출력 결과에서 알 수 있듯이 android에서는 andr을 제외하고만 인쇄됩니다. , Python은 pyth를 제외하고만 인쇄합니다. 여기서는 Lazy 모드가 사용되기 때문입니다.

물론 수량을 표현할 수 있는 특수 문자도 있습니다. 예:

?:告诉引擎匹配前导字符 0 次或 1 次
+:告诉引擎匹配前导字符 1 次或多次
*:告诉引擎匹配前导字符 0 次或多次

이 부분의 지식 포인트를 요약하면 다음 표입니다.

탐욕 게으른 설명
? ? ? 0개 또는 1개의 발생, 이는 {0,1}
++? 은 한 번 이상 나타납니다. 이는 {1,}
**과 동일합니다. 은 0번 이상 나타납니다. 이는 {0,}
{n}{n}과 동일합니다. 정확히 n번 발생합니다
{n,m}{n,m}? 적어도 n개의 가지가 m번 이상 나타납니다
{n,}{n,}? n번 이상




다음 섹션
코스웨어