模糊字符串与grep匹配

时间:2015-05-20 16:58:37

标签: regex shell pattern-matching

我正在尝试匹配包含字符串ACTGGGTAAACTA的文件中的行。如果 我做了

grep "ACTGGGTAAACTA" file 

它为我提供了完全匹配的行。有没有办法允许一定数量的不匹配(替换,插入或删除)?例如,我正在寻找序列

  1. 最多3个允许的格式,例如" AGTGGGTAACCAA"等。

  2. 插入/删除(部分匹配,如" ACTGGGAAAATAAACTA"或" ACTAAACTA")

4 个答案:

答案 0 :(得分:4)

曾经有一个名为agrep的工具用于模糊正则表达式匹配,但它被放弃了。

http://en.wikipedia.org/wiki/Agrep有一些历史记录和相关工具的链接。

https://github.com/Wikinaut/agrep看起来像是一个复活的开源版本,但我还没有测试过它。

如果失败,请查看您是否可以找到tre-agrep发行版。

答案 1 :(得分:2)

您可以使用tre-agrep并使用-E开关指定edit distance。例如,如果您有一个文件foo

cat <<< EOF > foo
ACTGGGAAAATAAACTA
ACTAAACTA
ACTGGGTAAACTA
EOF

您可以将每行编辑距离最多匹配为9,如下所示:

tre-agrep -s -9 -w ACTGGGTAAACTA foo

输出:

4:ACTGGGAAAATAAACTA
4:ACTAAACTA
0:ACTGGGTAAACTA

答案 2 :(得分:0)

简短回答:没有。

长答案:正如@JDB said一样,正则表达式本质上是精确的。您可以在某个位置手动添加[ATGC]而不是A等不匹配项,但无法仅允许少量任何不匹配项。我建议您编写自己的代码来解析它,或者尝试在某处找到DNA解析器。

答案 3 :(得分:0)

有一个名为fuzzysearch的Python库(我写过),它提供了所需的功能。

下面的一些示例代码应该起作用:

from fuzzysearch import find_near_matches

with open('path/to/file', 'r') as f:
    data = f.read()

# 1. search allowing up to 3 substitutions
matches = find_near_matches("ACTGGGTAAACTA", data, max_substitutions=3)

# 2. also allow insertions and deletions, i.e. allow an edit distance
#    a.k.a. Levenshtein distance of up to 3
matches = find_near_matches("ACTGGGTAAACTA", data, max_l_dist=3)