Python에서 정규식을 사용하여 문자열에서 데이터를 추출하려고합니다.
문자열은 "첫 주문 15 % 할인"입니다. 이 문자열에서 15 개를 추출하고 싶습니다. 이를 위해 나는-
import re
pattern = r'.*(\d+)\s*\%.*off.*'
string = '15% Off your first order'
m = re.match(pattern, string, re.I)
print m.group(1)
그러나,이 반환 5
하지 15
. 내가 무엇을 놓치고 있습니까?
실제 문제는 여기에 있습니다
.*(\d+)
.*
욕심입니다. 따라서 실제 일치는 이와 같이 발생합니다.
r'.*(\d+)\s*\%.*off.*'
.*
탐욕스럽고 RegEx가 충족되는지 확인하기 때문에 먼저 전체 문자열과 일치합니다. 만족스럽지 않기 때문에 마지막 문자를 남기고 RegEx와 일치하는지 확인합니다. 따라서이 작업을 지속적으로 수행하고 나머지 문자열 과 일치하는 항목 1
을 찾습니다 (\d+)\s*\%.*off.*
. 그래서, .*
실제로는 5를 맞추기 위해 까지 1
그리고 떠나는 \d+
것을 일치 5
시킵니다. 그것이주는 이유 입니다. 이렇게 탐욕스럽지 않게 변경
r'.*?(\d+)\s*\%.*off.*'
지금 .*
때문에 비 욕심이다 ?
. 따라서 가능한 한 최소한으로 일치합니다. 따라서 \d+
15와 일치 하므로 여기에서는 아무것도 일치하지 않습니다 .
참고 : 보시다시피 가능한 모든 일치 항목을 반복적으로 시도해야합니다. 그래서 그것은 매우 비효율적입니다. 실제로 이렇게 쓸 수 있습니다
r'.*?(\d+)\s*?\%\s*?off.*'
탐욕스럽지 않은 연산자를 모든 곳에서 사용하기 때문에 원래 탐욕스러운 버전보다 낫습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다