【问题标题】:fuzzy string matching with grep用 grep 匹配模糊字符串
【发布时间】:2015-05-20 16:58:36
【问题描述】:

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

grep "ACTGGGTAAACTA" file 

它给了我完全匹配的行。有没有办法允许一定数量的不匹配(替换、插入或删除)?比如我在找序列

  1. 最多允许 3 个替换,如“AGTGGGTAACCAA”等。

  2. 插入/删除(具有部分匹配,如“ACTGGGAAATAAACTA”或“ACTAACTA”)

【问题讨论】:

  • 您的意思是“查找 ACTGGGTAAACTA 或最多可更改 3 个字母的序列”吗?
  • 正则表达式不是模糊匹配工具。您必须非常准确地了解您正在寻找的内容。您可以明确声明某些字符可能会丢失(例如,ACTGGGTA{1,3}CTA 可以匹配 ACTGGGTACTAACTGGGTAACTAACTGGGTAAACTA),但是您的正则表达式越“模糊”,不受欢迎的匹配就越多你最终会得到。
  • Fuzzy regular expressions的可能重复

标签: regex shell pattern-matching


【解决方案1】:

以前有一个叫agrep的工具用于模糊正则表达式匹配,但被废弃了。

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

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

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

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

      有一个名为 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)
      

      【讨论】:

        【解决方案4】:

        简答:没有。

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

        【讨论】: