> 백엔드 개발 > 파이썬 튜토리얼 > `re.search()`가 일치하는 항목을 찾을 때 `re.findall()`이 빈 목록을 반환하는 이유는 무엇입니까?

`re.search()`가 일치하는 항목을 찾을 때 `re.findall()`이 빈 목록을 반환하는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-19 09:23:09
원래의
118명이 탐색했습니다.

Why Does `re.findall()` Return an Empty List When `re.search()` Finds a Match?

re.findall 동작

re.findall() 함수는 다음과 같은 경우 예상 결과를 반환하지 않으면 혼란스러울 수 있습니다. 문자열과 일치합니다. 특정 사례에서 해당 동작의 이유를 살펴보겠습니다.

문제 설명

다음 소스 문자열을 고려하세요.

s = r'abc123d, hello 3.1415926, this is my book'
로그인 후 복사

그리고 다음 패턴:

pattern = r'-?[0-9]+(\.[0-9]*)?|-?\.[0-9]+'
로그인 후 복사

re.search를 사용하면 올바른 결과를 얻습니다. 결과:

m = re.search(pattern, s)
print(m)  # <_sre.SRE_Match object; span=(3, 6), match='123'>
로그인 후 복사

그러나 re.findall은 빈 목록을 반환합니다.

L = re.findall(pattern, s)
print(L)  # []
로그인 후 복사

문제 이해

두 가지가 있습니다. 주요 측면 고려:

  1. 빈 일치 캡처 그룹: re.findall은 일치 개체에서 캡처된 텍스트를 반환하지만 이 패턴에서는 캡처 그룹이 없습니다. 결과적으로 빈 문자열을 반환합니다.
  2. 문자 이스케이프: \. 패턴에서 두 문자, 개행 문자를 제외한 모든 문자와 일치합니다. 이는 숫자 값 일치를 위한 것이 아닙니다.

해결책

숫자 값을 올바르게 일치시키려면 대신 다음 패턴을 사용하십시오.

pattern = r'-?\d*\.?\d+'
로그인 후 복사

이 패턴은 다음과 일치합니다:

  • -? - 선택적 빼기 기호
  • d* - 선택적 숫자
  • .? - 선택적 소수 구분 기호
  • d - 하나 이상의 숫자

이 수정된 패턴을 사용하면 re.findall이 예상 목록을 반환합니다.

['123', '3.1415926']
로그인 후 복사

위 내용은 `re.search()`가 일치하는 항목을 찾을 때 `re.findall()`이 빈 목록을 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿