python - 近似匹配的位置

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

预先感谢您的帮助。

最佳答案

基本方法:

  • 分组 stn 个连续的 n 字符 block ,其中 nlen(ptn)
  • 计算每个 block 和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]

关于python - 近似匹配的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19990808/

相关文章:

python - 在 Python 中使用多处理模块提高速度

python - 如何在 Python 中填写 PDF 表单?

r - 使用 gsub 在字符串中仅保留字母数字字符和空格

c - 字符串函数中的子字符串搜索给出了不正确的值

c++ - 如何在 std::list 中使用递归?

html - 使用绝对和顶部将页脚定位在页面底部

python - GTK+3+Python : "Loading..." dialog

python - celery (Redis)结果后端不工作

java - 如何在已排序的数组中插入数字

c# - unity : 3D movement/Collision detection failure (AddForce, MovePosition, transform.localPosition)