2016-09-06 5 views
2

정규 표현식을 사용하여 문자열에서 하위 문자열을 추출하려고합니다. 아래 Python (제공 원하는 결과)의 작업 코드Perl과 Python에 비해 TCL에서 다르게 동작하는 정규식 패턴

파이썬 솔루션입니다

x = r'CAR_2_ABC_547_d' 
>>> spattern = re.compile("CAR_.*?_(.*)") 
>>> spattern.search(x).group(1) 
'ABC_547_d' 
>>> 

펄 솔루션

$ echo "CAR_2_ABC_547_d" | perl -pe's/CAR_.*?_(.*)/$1/' 
ABC_547_d 

TCL 솔루션

그러나, I 너를 해봐. Tcl에서이 접근 방식을 기울이면 다른 결과가 나옵니다. 누군가가이 동작

% regexp -inline "CAR_.*?_(.*)" "CAR_2_ABC_547_d" 
CAR_2_ {} 

답변

4

지점에 대해 언급시겠습니까하면 환경 설정을 가지고 에서 처음으로 정량화 된 원자와 같은 기본 설정을 가지고 있습니다.

그래서 첫 번째 한정사로 .*이있는 경우, 전체 RE 욕심 될 것 및 첫 번째 한정사로 .*?이있는 경우, 전체 RE가 아닌 욕심 일 것이다.

처음에는 .*?을 사용 했으므로 추가 표현식은 지연 모드만을 따른다.

끝 부분에 $을 추가하면 전체와 일치합니다.

% regexp -inline "CAR_.*?_(.*)$" "CAR_2_ABC_547_d" 
CAR_2_ABC_547_d ABC_547_d 

참조 :re_syntax

+0

내 요구 사항은 하위를 추출하는 것입니다 문자열 "ABC_547_d". 나는 의도적으로 '?'를 사용하여 욕심이 없도록했습니다. TCL이 아닌 파이썬에서 왜 작동하는지 이해하고 싶습니다. – sarbjit

+0

이것은'Tcl'과 관련됩니다. 첫 번째 한정 기호는 욕심이 없기 때문에'. *'는 빈 문자열에만 매치합니다. '. +'를 사용했다면, 그것은 당신에게 문자 'A'만을 줄 것입니다. – Dinesh

+0

Tcl regex with grouping method를 사용하여 원하는 결과를 얻는 방법을 제안 할 수 있습니까? Perl과 Python에서 작동하는 원래 정규식을 볼 수 있습니다. TCL은 regex를 다르게 처리합니까? – sarbjit

1

, 대신 접두사 제거하는 것입니다, 접두사를 다음 텍스트를 캡처하는 또 다른 방법 :

% set result [regsub {^CAR_.*?_} "CAR_2_ABC_547_d" {}] 
ABC_547_d