python中正则表达式*?的一个问题
PHP中文网
PHP中文网 2017-04-17 17:27:36
0
4
723

1.看书上教材说*?是非贪婪模式,那么对于下面这段代码,为啥结果是空呢?

>>> import re
>>> line = 'cats are smart than dogs.'
>>> m=re.match(r'(.*?)',line)
>>> m.group()

结果为:''
为什么结果为空呢?不应该是cats么?难道字符串前默认有个空字符?
新手求明白人给解答下,谢谢了

PHP中文网
PHP中文网

认证0级讲师

모든 응답(4)
大家讲道理

. = 임의의 문자
* = 0회 이상 나타남, {0,}
?과 동일, 이전 일치 항목이 가장 적은 문자 선택, {0,1}

결론적으로 말하면 "모든 문자가 0번 등장한다"는 의미이므로 아무것도 없습니다.

과 일치하려면 cats, cats 뒤에 공백을 사용해야 합니다. r'(.*?) '

小葫芦

개인적인 이해에 따르면 .*?는 시작 위치인 ^과 일치하며 정규식에서는 다음과 같이 위치도 일치할 수 있습니다. 으아아아

이 예는

을 대체하고 ^에도 동일하게 적용되므로 $.*?과 직접 일치합니다.^PS: 정규 표현식을 사용할 때, 특히 텍스트 콘텐츠가 많은 경우
은 사용하지 않는 것이 좋지만 .* 또는 [sS]* 등은 사용하지 않는 것이 좋습니다. [dD]*

小葫芦

정규식 탐욕적 일치와 비탐욕적 일치의 차이점은 다음과 같습니다.

  • 그리디 모드: 매칭이 가능할 때 가장 긴 을 매칭합니다. ?으로 끝나지 않는 표현입니다.

  • 비 욕심 모드: 매칭이 가능한 경우, 가장 짧은 을 매칭합니다. 표현식은 ?으로 끝납니다.

예를 들어 문자열 abcabcabc에서 a로 시작하고 c으로 끝나는 문자열을 일치시키려면 abc, abcabc, abcabcabc 세 가지 일치 항목이 있습니다. 가장 긴 abcabcabca.*c과 일치할 수 있고, 가장 짧은 abca.*?c과 일치할 수 있습니다.

으아아아

결과가 비어 있는 이유는 무엇인가요? 고양이여야 하지 않나요?

.*은 그리디 패턴이므로 각 문자가 임의의 문자(.)로 구성된 가장 긴 문자열, 즉 모든 입력 문자로 구성된 문자열과 일치합니다. 그리고 .*?는 non-greedy 모드로, 각 문자가 임의의 문자(.)인 가장 짧은 문자열, 즉 빈 문자열과 일치합니다.

고양이라는 단어를 일치시키려면 cats을 사용해야 합니다. 입력 문자열의 첫 번째 단어를 일치시키려면 w+ 또는 S+을 사용해야 합니다.

으아아아

기본적으로 문자열 앞에 null 문자가 있나요?

아니요, 하지만 정규식에서는 ^를 사용하여 문자열의 시작 위치를 나타내고 $을 사용하여 끝 위치를 나타낼 수 있습니다. 이 두 문자(^$)는 일치 규칙에 의해 지정된 기호이며 사용자가 작성하는 규칙 문자열에 사용된다는 점에 유의하세요. 이는 일치할 문자열에 이 두 기호가 포함되어 있다는 의미는 아닙니다.

黄舟

. 경계 일치는 일치하는 문자열의 문자를 소비하지 않으며 비탐욕 모드이므로

문자열을 일치시킬 수 없습니다.
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿