验证 C/C++ 中的 DNA

发布于 2024-10-29 05:33:40 字数 264 浏览 0 评论 0原文

我正在迭代 DNA 序列,一次将 5-15 个碱基的块拉出到 C++ std::string 对象中。有时,我的字符串会包含非 ATCG 碱基,我想在发生这种情况时采取行动。例如,我可能会看到:

CTACGGTACGRCTA

因为有一个“R”,所以我想识别这种情况。我熟悉正则表达式,但人们似乎推荐了几个不同的库。我见过 Boost、TR1 等。有人可以建议一种不同的方式来捕获我的案例,或者告诉我应该使用哪个库以及为什么?

谢谢

I am iterating over DNA sequences pulling out chunks of 5-15 bases at a time into C++ std::string objects. Occasionally, my string will contain a non ATCG base, and I want to take an action when this happens. For example, I might see:

CTACGGTACGRCTA

Because there is an 'R', I want to recognize this case. I am familiar with regex, but people seem to recommend several different libraries. I've seen Boost, TR1, and others. Can someone please suggest either a different way to catch my cases or tell me which library I should use and why?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

荒芜了季节 2024-11-05 05:33:40

正则表达式对此来说太过分了。您可以使用 std::string::find_first_not_of()

A regular expression is overkill for this. You can use std::string::find_first_not_of().

简单爱 2024-11-05 05:33:40

我想到了使用 C strspn()

if (strspn(dnasequence, "ATCG") < strlen(dnasequence)) {
    /* bad character found */
}

Using C strspn() comes to mind.

if (strspn(dnasequence, "ATCG") < strlen(dnasequence)) {
    /* bad character found */
}
轻许诺言 2024-11-05 05:33:40

您当然可以使用正则表达式。但为什么不保持简单呢?

bool is_valid_base(char base) {
    switch (std::toupper(base)) {
        case 'A': case 'C': case 'G': case 'T': return true;
        default: return false;
    }
}

bool is_valid_dna(std::string sequence) {
    for (std::string::const_iterator i = sequence.begin(), end = sequence.end();
            i != end; ++i)
        if (not is_valid_base(*i))
            return false;
    return true;
}

You can of course use regular expressions. But why not keep it simple?

bool is_valid_base(char base) {
    switch (std::toupper(base)) {
        case 'A': case 'C': case 'G': case 'T': return true;
        default: return false;
    }
}

bool is_valid_dna(std::string sequence) {
    for (std::string::const_iterator i = sequence.begin(), end = sequence.end();
            i != end; ++i)
        if (not is_valid_base(*i))
            return false;
    return true;
}
清眉祭 2024-11-05 05:33:40

如果您想使用正则表达式来解决此问题,这里是一个检查一个无效字符的正则表达式:

[^CGAT]

或者这是一个用于验证整个序列的正则表达式:

^[CGAT]+$

非常简单。

编辑:删除了不相关的材料。

If you would like to use a regex to solve this problem, here is one that checks for one invalid char:

[^CGAT]

Or here is a regex to validate an entire sequence:

^[CGAT]+$

Pretty simple.

Edit: Removed irrelevant material.

阳光①夏 2024-11-05 05:33:40

R 代表潜在的 DNA 对(“字母”)吗?
如果是这样,为了正确显示或准确解释整个序列,碱基对的排序至关重要。

在密码子中。确定R在哪个位置? RAA、ARA、AAR,了解这一点非常重要。然后通过定义它们的属性来处理它们。

如果它只是垃圾或可能是数据存储中剩余的数据。循环并删除。

Does R represent a potential DNA pair ('letter')?
If so, the ordering of base pairs is critical in order to correctly display or accurately interpret the entire sequence as a whole.

In a codon. Determine in which place the R is in? RAA, ARA, AAR, knowing this is very important. Then handle these by defining their attributes.

If its just junk or left over data from perhaps data storage. Loop through and remove.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文