首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用R解析字符串(通过“新”标记)?

如何用R解析字符串(通过“新”标记)?
EN

Stack Overflow用户
提问于 2010-03-16 10:13:00
回答 1查看 1K关注 0票数 1

我想使用R来进行字符串解析,这(我认为)就像一个简单的HTML解析。

例如,假设我们有以下两个变量:

代码语言:javascript
复制
Seq <- "GCCTCGATAGCTCAGTTGGGAGAGCGTACGACTGAAGATCGTAAGGtCACCAGTTCGATCCTGGTTCGGGGCA"
Str <- ">>>>>>>..>>>>........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<."

假设我想根据"Str“解析"Seq”,使用这里的图例

代码语言:javascript
复制
Seq: GCCTCGATAGCTCAGTTGGGAGAGCGTACGACTGAAGATCGTAAGGtCACCAGTTCGATCCTGGTTCGGGGCA
Str: >>>>>>>..>>>>........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<.
     |     |  |              | |               |     |               ||     |
     +-----+  +--------------+ +---------------+     +---------------++-----+
        |        Stem 1            Stem 2                 Stem 3         |
        |                                                                |
        +----------------------------------------------------------------+
                                Stem 0

假设我们总是有4个词干(0到3),但每个词干前后的字母长度可以很大。

输出应该类似于以下列表结构:

代码语言:javascript
复制
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)。

EN

回答 1

Stack Overflow用户

发布于 2010-03-16 11:22:08

您可以通过使用运行长度编码来简化任务。

首先,将Str转换为单个字符的向量,然后调用rle

代码语言:javascript
复制
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,这可能更简单。例如,一个内部的茎看起来总是像">" "." "<"

我认为您需要考虑的主要问题是数据的结构。"."总是必须介于">""<"之间,还是它是可选的?一开始你能要一个"."吗?你是否需要能够概括到茎内部的茎,或者更复杂的结构?

一旦解决了这个问题,构建列表输出应该是非常简单的。

另外,不要担心使用循环,它们在语言中是因为它们是有用的。先让它起作用,然后再担心速度优化(如果你真的需要的话)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2453462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档