我的问题如下: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