file(1) 和 magic(5) :对结果进行优先级排序

file(1) 和 magic(5) :对结果进行优先级排序

我的问题如下:file(1) 和 magic(5) :描述其他格式

我想描述一个 FASTA 序列(http://en.wikipedia.org/wiki/FASTA_format

它可能是一个DNA序列(仅 ATGC)

>header
ATGCTAGCATAGCATCGATGCTGTAGCTACGTAGCTACGTCTACG

一个“神奇”的模式是

>.*\n[ATGC]*

或一个蛋白质序列( ACDEFGHIKLMNPQRSTVWYBZX 也包含 ATGC)

>header
AHITKLMNPQRGHIKLMNPQRC

一个“神奇”的模式是

>.*\n[ACDEFGHIKLMNPQRSTVWYBZX]*

但是每当我使用这些正则表达式时,文件都会告诉我它是一种蛋白质,因为它与第二个正则表达式匹配。有没有办法确定结果的优先级?有没有一种方法可以优先考虑,例如“如果该模式匹配,请勿尝试任何其他模式?”。

答案1

您可以使用“强度”值设置优先级。从魔法(5):

可以在单独的行上提供可选的强度,它使用以下格式引用当前的魔法描述:

    !:strength OP VALUE

操作数 OP 可以是:+、-、* 或 /,VALUE 是 0 到 255 之间的常量。使用指定的操作数将该常量应用于当前计算的默认魔法强度。

要降低蛋白质描述的优先级,请附加以下行:

!:strength - N

...哪里N足够大以使其低于 DNA 描述的分数。

测试的“当前计算的默认魔法强度”并不是立即显而易见的,但您可以使用该--list标志来显示所有内容。或者,阅读源代码——负责的函数是apprentice_magic_strength。它是根据条目的第一个测试计算得出的,因此如果您想让一种类型优先于另一种类型,那么具有相同的第一行会很有帮助。 (这样,N只需为 1。)

另一个问题:您的正则表达式不够严格。 *可以匹配零个字符,因此可以在每行的开头找到该模式 - 蛋白质、DNA 或其他。要拧紧它,请确认整条线包括仅有的允许的字符数:\n[ATGC]+$, 或\n[ATGC]{num,}$(其中 num 是您期望看到的最短模式)

0       string  =>header
>&0      regex   \n[ATGC]+$     DNA

0       string  =>header
>&0      regex   \n[ACDEFGHIKLMNPQRSTVWYBZX]+$  PROTEIN
!:strength - 1

相关内容