我想使用R来进行字符串解析,这(我认为)就像一个简单的HTML解析。
例如,假设我们有以下两个变量:
Seq <- "GCCTCGATAGCTCAGTTGGGAGAGCGTACGACTGAAGATCGTAAGGtCACCAGTTCGATCCTGGTTCGGGGCA"
Str <- ">>>>>>>..>>>>........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<."假设我想根据"Str“解析"Seq”,使用这里的图例
Seq: GCCTCGATAGCTCAGTTGGGAGAGCGTACGACTGAAGATCGTAAGGtCACCAGTTCGATCCTGGTTCGGGGCA
Str: >>>>>>>..>>>>........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<.
| | | | | | | || |
+-----+ +--------------+ +---------------+ +---------------++-----+
| Stem 1 Stem 2 Stem 3 |
| |
+----------------------------------------------------------------+
Stem 0假设我们总是有4个词干(0到3),但每个词干前后的字母长度可以很大。
输出应该类似于以下列表结构:
list(
"Stem 0 opening" = "GCCTCGA",
"before Stem 1" = "TA",
"Stem 1" = list(opening = "GCTC",
inside = "AGTTGGGA",
closing = "GAGC"
),
"between Stem 1 and 2" = "G",
"Stem 2" = list(opening = "TACGA",
inside = "CTGAAGA",
closing = "TCGTA"
),
"between Stem 2 and 3" = "AGGtC",
"Stem 3" = list(opening = "ACCAG",
inside = "TTCGATC",
closing = "CTGGT"
),
"After Stem 3" = "",
"Stem 0 closing" = "TCGGGGC"
)我没有编写解析器的经验,我想知道在编写这样的程序时应该使用什么策略(以及建议使用的任何R命令)。
我想的是先去掉“茎0",然后用递归函数(让我们称之为"seperate.stem")遍历内部字符串,每次将字符串拆分为: 1.在茎之前2.打开茎3.内部茎4.关闭茎5.茎后
然后,“后继”将递归地输入到相同的函数("seperate.stem")中。
问题是,我不知道如何在不使用循环的情况下进行这种编码。
任何建议都将受到最欢迎。
更新:有人给我发了一大堆问题,他们来了。
Q:每个序列对开头序列的">>>>“数与结尾序列上的"<<<<”相同吗?
A:是的
Q:解析总是以部分词干0开头吗? A:不是。有时它会从几个开始“。
问:有什么方法可以确保你在开始的时候有正确的序列吗? A:我不确定我是否理解你的意思。
问:字符串中间有可能出现错误,需要重新启动吗? A:很遗憾,是的。在这种情况下,我需要忽略一个内在的茎.
问:这些字符串要解析多长时间? A:每个字符串有60到150个字符(我有成千上万的字符串.)
问:每个序列都是一个自包含的序列吗,就像您在示例中显示的那样,还是每个序列都包含了数千个字符? A:每个序列都是自包含的。
问:是否总是至少有一个‘’。茎间?
答:没有。
Q:关于应该如何进行解析的一整套规则将是有用的。 A:我同意。但是,由于我对如何开始编写这些代码甚至没有基本的想法,所以我首先想在开始时得到一些帮助,然后尝试在返回求助之前对其他情况进行调整。
问:您有解析的BNF语法吗? A:没有。你的电子邮件是我第一次看到它(http://en.wikipedia.org/wiki/Backus-Naur_Form)。
发布于 2010-03-16 11:22:08
您可以通过使用运行长度编码来简化任务。
首先,将Str转换为单个字符的向量,然后调用rle。
split_Str <- strsplit(Str, "")[[1]]
rle_Str <- rle(split_Str)
Run Length Encoding
lengths: int [1:14] 7 2 4 8 4 1 5 7 5 5 ...
values : chr [1:14] ">" "." ">" "." "<" "." ">" "." "<" "." ">" "." "<" "."现在只需要解析rle_Str$values,这可能更简单。例如,一个内部的茎看起来总是像">" "." "<"。
我认为您需要考虑的主要问题是数据的结构。"."总是必须介于">"和"<"之间,还是它是可选的?一开始你能要一个"."吗?你是否需要能够概括到茎内部的茎,或者更复杂的结构?
一旦解决了这个问题,构建列表输出应该是非常简单的。
另外,不要担心使用循环,它们在语言中是因为它们是有用的。先让它起作用,然后再担心速度优化(如果你真的需要的话)。
https://stackoverflow.com/questions/2453462
复制相似问题