我正在尝试匹配包含字符串ACTGGGTAAACTA
的文件中的行。如果我这样做
grep "ACTGGGTAAACTA" file
它会给我准确匹配的行。是否有一种方法可以允许一定数量的不匹配(替换,插入或删除)?例如,我正在寻找以下序列:
允许最多3个替换,如“AGTGGGTAACCAA”等。
插入/删除(具有部分匹配,例如“ACTGGGAAAATAAACTA”或“ACTAAACTA”)
我正在尝试匹配包含字符串ACTGGGTAAACTA
的文件中的行。如果我这样做
grep "ACTGGGTAAACTA" file
它会给我准确匹配的行。是否有一种方法可以允许一定数量的不匹配(替换,插入或删除)?例如,我正在寻找以下序列:
允许最多3个替换,如“AGTGGGTAACCAA”等。
插入/删除(具有部分匹配,例如“ACTGGGAAAATAAACTA”或“ACTAAACTA”)
agrep
的工具用于模糊正则匹配,但是它已经被废弃了。tre-agrep
。tre-agrep
命令,并使用-E
参数指定编辑距离。例如,如果你有一个文件foo
:cat <<< EOF > foo
ACTGGGAAAATAAACTA
ACTAAACTA
ACTGGGTAAACTA
EOF
tre-agrep -s -9 -w ACTGGGTAAACTA foo
输出:
4:ACTGGGAAAATAAACTA
4:ACTAAACTA
0:ACTGGGTAAACTA
有一个名为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)
cat file | fzf --filter='ACTGGGTAAACTA'
以下代码也可以工作,因为您将文件重定向到STDIN,而fzf
从中读取。
fzf --filter='ACTGGGTAAACTA' < file
实际上,您还可以通过启动其用户界面来交互式地查看fzf
如何过滤行:
cat file | fzf
简短回答: 不行。
详细回答: 如 @JDB 所说,正则表达式固有的精确性。你可以手动添加不匹配项,例如在某些位置上使用 [ATGC]
代替 A
,但是没有办法只允许少量的任何不匹配项。我建议您编写自己的代码来解析它,或尝试在其他地方找到一个DNA解析器。
ACTGGGTA{1,3}CTA
可以匹配ACTGGGTACTA
、ACTGGGTAACTA
和ACTGGGTAAACTA
),但是你越是让正则表达式变得“模糊”,就会得到更多不想要的匹配结果。 - JDB