행동

2014-06-23 4 views
2

파이썬 버전 3.4.1을 사용하고 난 다음의 정규 식의 결과 이해하지 않는다 : 나는 결과가행동

을 것으로 기대

import re 
print(re.match("\[{E=(.*?),Q=(.*?)}\]","[{E=KT,Q=P1.p01},{E=KT2,Q=P2.p02}]").groups()) 
('KT', 'P1.p01},{E=KT2,Q=P2.p02') 

('KT', 'P1.p01') 

하지만 분명히 두 번째. *? 끝까지 '}]'까지 모든 문자를 '먹는다'. 나는 처음에 중지 기대 '['와 '] 문자 행동이 내가 예상대로입니다'} "문자

을 나는을 생략합니다. '

print(re.match("{E=(.*?),Q=(.*?)}","{E=KT,Q=P1.p01},{E=KT2,Q=P2.p02}").groups()) 

('KT', 'P1.p01') 
+0

[regex101] (http://regex101.com/r/jO6cU0)에서 정규식에 대한 설명을 볼 수 있습니다. – jonrsharpe

답변

4

\]는 사각형을 강제로 브래킷이 일치하는 부분에 나타나야하며 문자열 끝에 하나만 있습니다. 정규식 엔진은 일치시킬 다른 옵션이 있습니다. 선택 사항을 제거하거나 선택하면 (\]?) 가장 가까운 }에 멈춥니다

+0

또는 브래킷과'} '사이에 탐욕스러운. *를 추가 할 수 있습니다. –

2

당신이 원하는 것 같습니다 '{E=' 사이의 모든 것과 다음 쉼표 ','이면 'Q='과 다음 닫는 중괄호 '}' 사이의 모든 것입니다. 이렇게하는 표현은 다음과 같습니다.

{E=([^,]*),Q=([^}]*)} 

예 : [^,]*은 "가능한 한 많은 쉼표가 아닌 문자"로 을 의미합니다..

사용 예제는 :

>>> import re 
>>> re.findall("{E=([^,]*),Q=([^}]*)}", 
       "{E=KT,Q=P1.p01},{E=KT2,Q=P2.p02}") 
[('KT', 'P1.p01'), ('KT2', 'P2.p02')] 

당신은 this regex101 demo에 대한 자세한 설명을 볼 수 있습니다.