2015-02-04 5 views
0

문자열을 파이썬으로 그룹화하고 싶지만 실제로 문제에 접근하는 방법을 모르겠습니다. 이러한 자신의 시리즈 이름으로문자열 패턴을 인식하는 방법은 무엇입니까?

test-1.jpg 
test-2.jpg 
test-3.jpg 
supertest-828.jpg 
supertest-8429.jpg 
5-mega-5435-test.jpg 
5-mega-453-test.jpg 
5-mega-325-test.jpg 

가 지금은 그룹에 원하는 :

내가 파일 이름 목록을 갖고 있다고 할 수 있습니다. 좋은 결과는 다음과 같은 사전 일 수 있습니다.

{"test-x.jpg":("test-1.jpg","test-2.jpg","test-3.jpg"), "supertest-x.jpg":(...), "5-mega-x-test.jpg":(...)} 

이제이 문제에 접근하는 가장 좋은 방법이 무엇인지 궁금합니다. 나는 파일 이름에있는 모든 숫자를 대체하고 싶지 않습니다. 대신 나는 변화하고있는 숫자를 찾고이 시리즈를 "x"로 대체하여 시리즈의 식별자를 얻는 방법이 필요합니다.

그래서 문자열을 비교하고 유사하지 않은 부분을 식별하려면 어떻게해야합니까?

가능한 동굴 열은 변경해서는 안되는 문자열에 2 개 이상의 "x"와일드 카드와 정적 숫자가 필요한 여러 개의 변경 숫자입니다.

도움 주셔서 감사합니다.

+0

[Regex] (https://docs.python.org/2/library/re.html)를 사용할 수 있습니다. – levi

+2

'동굴 난방 '? '주의'를 의미합니까? –

+1

마지막 그룹 앞에서 완전히 사라지는'5-'는 텍스트로 설명 할 수 없는데, 마지막 그룹에 무슨 일이 생길지 ** ** 정말로 **? 명확히하십시오! –

답변

3
import re 

def genericize(s): 
    # replace one or more digits with an "x" 
    return re.sub("\d+", "x", s) 
다음

>>> genericize("test-29.jpg") 
'test-x.jpg' 

및 전체 프로그램은 다음

from collections import defaultdict 

def group_fnames(lst): 
    result = defaultdict(list) 
    for fname in lst: 
     result[genericize(fname)].append(fname) 
    return result 

fnames = [ 
    'test-1.jpg', 
    'test-2.jpg', 
    'test-3.jpg', 
    'supertest-828.jpg', 
    'supertest-8429.jpg', 
    '5-mega-5435-test.jpg', 
    '5-mega-453-test.jpg', 
    '5-mega-325-test.jpg' 
] 

print(group_fnames(fnames)) 

하게는

을 제공합니다 0
{ 
    'supertest-x.jpg': ['supertest-828.jpg', 'supertest-8429.jpg'], 
    'test-x.jpg': ['test-1.jpg', 'test-2.jpg', 'test-3.jpg'], 
    'x-mega-x-test.jpg': ['5-mega-5435-test.jpg', '5-mega-453-test.jpg', '5-mega-325-test.jpg'] 
} 
+0

답장을 보내 주셔서 감사합니다. 문제는 x-mega-x-test.jpg 대신 5-mega-x-test.jpg를 주어야한다는 것입니다. 왜냐하면 5는 상수가 아니고 시퀀스이기 때문입니다. 그게 어떻게 고쳐 졌을까요? – JasonTS

+0

모든 파일을 볼 때까지 정적 인 값을 알 수 없기 때문에 정적 숫자를 식별하려면 다른 후 처리 패스가 필요하며 "6-mega-18-test.jpg"를 찾으면 5-etc는 정적이 아닙니다. –