2013-11-14 5 views
1

문자열에서 특정 패턴의 대략적인 일치를 만들 수있는 스크립트 작업 중입니다.이 패턴 (중첩 될 수 있음)이 시작되는 위치 만보고합니다.근사 일치 위치

지금까지, 나는 정확히 일치의 위치를보고 할 수있는 스크립트를 얻을 수 있지만 대략적인 사람을위한 성공 :

import re 
stn = 'KLHLHLHKPLHLHLPHHKLHKLPKPH' 
pat = 'KLH' 
matches = re.finditer(r'(?=(%s))' % re.escape(pat), stn) 
finalmatch= [m.start() for m in matches] 
pos = ' '.join(str(v) for v in finalmatch) 
print pos 

이 경우 결과는 다음과 같습니다 하지만 경우 스크립트 보고서도 대략 일치합니까? 즉 허용 된 최대 오류 (허용치 또는 임계 값)가 1 (쿼리 패턴의 모든 위치) 인 경우 HLH, PLH, KLP, KPH의 초기 위치는 어떻게보고 될 수 있습니까?

나는 이미 Levenshtein이나 SequenceMatcher와 같은 거리 측정을 포함 시키려고했으나 성공하지 못했습니다.

미리 도움을 주셔서 감사합니다.

답변

0

그냥 패턴을 변경

import re 
from itertools import chain 
stn = 'KLHLHLHKPLHLHLPHHKLHKLPKPH' 
pats = ['KLH', 'KL, 'LH, 'K', 'L', 'H'] 
matches = [] 
for pat in pats: 
    matches = chain(matches, (re.finditer(r'(?=(%s))' % re.escape(pat), stn)) 
finalmatch= [m.start() for m in matches] 
pos = ' '.join(str(v) for v in finalmatch) 
print pos 
+0

내가 생각을 이해하지만, 스크립트 때문에 'LH (잘못된 구문)과 같은 불완전한 문자열의 오류를 불러 일으킨다. 나는 행렬을 사용하는 것과 마찬가지로 너무 복잡하게하지 않고 문제를 해결하는 방법을 모른다. –

+0

방금 ​​finditer()를 사용하고 있다는 것을 깨달았습니다. 이것은 목록 확장 대신에'chain()'을 사용해야한다는 것을 의미합니다. 아마도 이것이 도움이 될까요? 그렇지 않다면 코드를 실행할 때 얻을 수있는 추적을 제공 할 수 있습니까? –

1

기본 방법 :

  • 그룹 n는 각 청크와 동일 얼마나 많은 문자 len(ptn)
  • 카운트가 n 문자의 stn 연속 덩어리와 ptn
  • 시작하기 얼마나 많은 이들은 len(ptn)

예에서 하나 개의 문자 다르다 :

stn = 'KLHLHLHKPLHLHLPHHKLHKLPKPH' 
pat = 'KLH' 

n_combos = zip(*[stn[n:] for n in range(len(pat))]) 
m_counts = (sum(1 for i, j in zip(el, pat) if i == j) for el in n_combos) 
indices = [idx for idx, val in enumerate(m_counts) if val >= len(pat) - 1] 
# [0, 2, 4, 8, 10, 17, 20, 23] 
+0

답변 해 주셔서 감사합니다. 그 대신 가장 빈번한 팻치 (특정 길이 L의)가 필요하면이 위치를 대체 할 수 있습니까? L = 3 최대 m_counts.iteritems()에 대한 F, P = 0 maxpatt = [] : 경우 F> 최대 : maxpatt = [P] 최대 = ELIF의 F F == 최대 : maxpatt + = [피] –