2

文字列内の特定のパターンのおおよその一致を作成できるスクリプトに取り組んでおり、これらのパターン (重複している可能性があります) が開始される位置のみを報告します。

これまでのところ、正確な一致の位置を報告できるスクリプトを取得しましたが、おおよその位置については成功していません。

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

この場合の結果は 0 17 ですが、スクリプト レポートもほぼ一致する場合はどうでしょうか。つまり、最大許容誤差 (許容値またはしきい値) が (クエリ パターンの任意の位置で) 1 の場合、HLH、PLH、KLP、KPH の初期位置をどのように報告できますか?

私はすでに、Levenshtein や SequenceMatcher などの距離測定を含めようとしましたが、成功しませんでした。

よろしくお願いします。

4

2 に答える 2

1

基本的な方法:

  • 文字stnの連続するチャンクをグループ化します。nnlen(ptn)
  • 各チャンク間で同一の文字数をカウントし、ptn
  • これらのうち、1 文字異なるものがいくつあるのかを調べます。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]
于 2013-11-15T00:12:07.970 に答える
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
于 2013-11-15T00:06:22.443 に答える