Pie*_*rre 7 file-command regular-expression
我的问题如下:file(1) 和 magic(5) :描述其他格式。
我想描述一个 FASTA 序列(http://en.wikipedia.org/wiki/FASTA_format)
它可能是一个DNA 序列(只有 ATGC)
>header
ATGCTAGCATAGCATCGATGCTGTAGCTACGTAGCTACGTCTACG
Run Code Online (Sandbox Code Playgroud)
一个“神奇”的模式将是
>.*\n[ATGC]*
Run Code Online (Sandbox Code Playgroud)
或蛋白质序列(也包含 ATGC 的 ACDEFGHIKLMNPQRSTVWYBZX)
>header
AHITKLMNPQRGHIKLMNPQRC
Run Code Online (Sandbox Code Playgroud)
一个“神奇”的模式将是
>.*\n[ACDEFGHIKLMNPQRSTVWYBZX]*
Run Code Online (Sandbox Code Playgroud)
但是每当我使用这些正则表达式时,文件都会告诉我它是一种蛋白质,因为它与第二个正则表达式匹配。有没有办法对结果进行优先排序?有没有办法优先考虑,比如“如果匹配,不要尝试任何其他模式?”。
您可以使用“强度”值设置优先级。来自魔法(5):
可以在单独的行上提供可选的强度,它使用以下格式引用当前的魔法描述:
Run Code Online (Sandbox Code Playgroud)!:strength OP VALUE
操作数 OP 可以是:+、-、* 或 /,VALUE 是 0 到 255 之间的常量。使用指定的操作数将该常量应用于当前计算的默认魔法强度。
要降低蛋白质描述的优先级,请附加以下行:
!:strength - N
Run Code Online (Sandbox Code Playgroud)
...哪里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
Run Code Online (Sandbox Code Playgroud)