2009-04-27 9 views
2

문자열에서 하위 문자열을 찾기위한 코드를 작성했습니다. 모든 하위 문자열을 인쇄합니다. 하지만 길이가 2에서 6 사이 인 부분 문자열을 원하고 최소 길이의 부분 문자열을 인쇄하십시오. 나에게 도와주세요가장 짧은 하위 문자열 찾기

프로그램 :

import re 
p=re.compile('S(.+?)N') 
s='ASDFANSAAAAAFGNDASMPRKYN' 
s1=p.findall(s) 
print s1 

출력 :

['DFA', 'AAAAAFG', 'MPRKY'] 

원하는 출력 :

'DFA' length=3 
+0

최소 길이가 1보다 긴 문자열이 있으면 어떻게됩니까? – mhawke

+1

입력 한 제약 조건을 모르지만 정규 표현식에주의해야합니다. 예를 들어 'SASANSAAN'이라는 문자열을 사용하면 정규 표현식은 [ 'ASA', 'AA']를 반환합니다. 원하는 출력이 'A'('SAN') 일 때입니다. – Miles

답변

3

'S(.{2,6}?)N' 줄 것입니다 정규식 만 길이가 2 일치 - 6 자 .

가장 짧은 일치하는 부분 문자열을 반환하려면 sorted(s1, key=len)[0]을 사용하십시오.

전체 예 :

이 다음 정렬 된 목록의 첫 번째 항목을 반환, 길이 findall에 의해 반환 된리스트를 정렬하여 작동
import re 
p=re.compile('S(.{2,6}?)N') 
s='ASDFANSAAAAAFGNDASMPRKYNSAAN' 
s1=p.findall(s) 
if s1: 
    print sorted(s1, key=len)[0] 
    print min(s1, key=len) # as suggested by Nick Presta 

.

편집 : 닉 Presta의 대답은 이미 목록이있는 경우

8

, 당신은 len 기능과 함께 min 기능을 사용할 수 있습니다 ... 나는 minkey 인수를 수 있다는 것을 인식하지 않았다, 더 우아 두 번째 인수.

>>> s1 = ['DFA', 'AAAAAFG', 'MPRKY'] 
>>> min(s1, key=len) 
'DFA' 

EDIT :

>>> s2 = ['foo', 'bar', 'baz', 'spam', 'eggs', 'knight'] 
>>> s2_min_len = len(min(s2, key=len)) 
>>> [e for e in s2 if len(e) is s2_min_len] 
['foo', 'bar', 'baz'] 

: 동일한 길이의 두 가지 경우 모두 같은 길이 인 요소를 포함하는리스트를 생성하기 위해 상기 확장 할 수있는 이벤트에
'shortest'요소가 1 개 밖에없는 경우에도 위의 내용이 작동해야합니다.

EDIT 2 : 그냥 완료해야합니다. 최소한 간단한 테스트에 따르면, 가장 짧은 요소의 길이를 계산하고이를 목록 이해에 사용하는 것이 더 빠릅니다. 위에 업데이트되었습니다.

+0

+1 내 sorted() [0] 솔루션보다 훨씬 우아함 ... – codeape

관련 문제