近似匹配的位置

时间:2013-11-14 23:49:20

标签: python string position approximate

我正在编写一个脚本,能够对字符串中的某个模式进行近似匹配,只报告这些模式(它们可能重叠)的位置。

到目前为止,我获得了一个能够报告完全匹配位置的脚本,但是近似的没有成功:

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这样的距离测量,但没有成功。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

一种基本方式:

  • stn个字符nnlen(ptn) 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]
  • 之间的字符数相同
  • 了解其中有多少是与{{1}}
  • 不同的字符

例如:

{{1}}

答案 1 :(得分: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