2010-04-01 5 views
3

이 특정 문제에 접근하는 가장 좋은 방법에 대해 궁금해하고 라이브러리가 있으면 (파이썬이 바람직하지만 필요에 따라 유연해질 수 있음).SequenceMatcher는 두 개가 아닌 여러 입력을 지원합니까?

각 줄에 문자열이있는 파일이 있습니다. 각 줄마다 가장 긴 공통 패턴과 그 위치를 찾고 싶습니다. SequenceMatcher를 사용하여 선 1과 2, 1과 3을 비교할 수 있고 결과를 상관시킬 수 있다는 것을 알고 있습니다. 그러나 이미 그것을 수행하는 것이 있다면?

이상적으로 이러한 일치는 각 줄의 아무 곳에 나 표시되지만 처음에는 각 줄의 동일한 오프셋에있는 기존의 일치 항목을 사용할 수 있습니다. 문자열 테이블에 액세스 할 수있는 좋은 API를 가진 압축 라이브러리와 같은 것이 이상적 일지 모르지만 지금까지 설명에 맞는 것을 찾지 못했습니다.

\x00\x00\x8c\x9e\x28\x28\x62\xf2\x97\x47\x81\x40\x3e\x4b\xa6\x0e\xfe\x8b 
\x00\x00\xa8\x23\x2d\x28\x28\x0e\xb3\x47\x81\x40\x3e\x9c\xfa\x0b\x78\xed 
\x00\x00\xb5\x30\xed\xe9\xac\x28\x28\x4b\x81\x40\x3e\xe7\xb2\x78\x7d\x3e 
나는 같은 위치 호선 모든 라인이 0-1, 10-12 경기를 관람 할 것

[4,5]가 일치 호선 [5 :이 라인 예를 들어

, 6]은 line3 [7,8]와 일치합니다.

감사합니다.

답변

1

, 당신이 필요로하는 모든이 같은 것입니다 :

matches = [] 
zipped_strings = zip(s1,s2,s3) 
startpos = -1 
for i in len(zipped_strings): 
    c1,c2,c3 = zipped_strings[i] 
    # if you're not inside a match, 
    # look for matching characters and save the match start position 
    if startpos==-1 and c1==c2==c3: 
    startpos = i 
    # if you are inside a match, 
    # look for non-matching characters, save the match to matches, reset startpos 
    elif startpos>-1 and not c1==c2==c3: 
    matches.append((startpos,i,s1[startpos:i])) 
    # matches will contain (startpos,endpos,matchstring) tuples 
    startpos = -1 
# if you're still inside a match when you run out of string, save that match too! 
if startpos>-1: 
    endpos = len(zipped_strings) 
    matches.append((startpos,endpos,s1[startpos:endpos])) 

위치에 관계없이 가장 긴 일반적인 패턴을 찾으려면, SequenceMatcher는 않습니다 가장 좋은 생각처럼 들리지만, string1과 string2를 비교 한 다음 string1을 string3으로 비교하고 결과를 병합하려고하는 대신 get_matching_blocks와 함께 string1과 string2의 모든 공통 부분 문자열을 가져온 다음 각 결과를 string3과 비교하여 세 문자열 모두에서 일치합니다.

0

문제가 있습니까?

입력 한 크기는 얼마나됩니까?

최소 문자열 길이는 2와 일치합니까?

예제가 올바르지 않습니다. 예상 한 결과가 제공 한 샘플 문자열과 일치하지 않기 때문입니다. 당신이 원하는 모든 각 줄에 같은 오프셋 (offset)에있는 일반 문자열을 찾을 경우

관련 문제