0

我正在处理 DNA、RNA 和蛋白质序列,QRegExp无法检测序列是否仅包含某些字符。例如 unambiguous 仅包含 acgt :

seq.contains(QRegExp("[gatc]"))

对我不起作用。我该如何纠正?

4

3 回答 3

0

您正在寻找该序列是否包含 gatc. 您也不应该使用QRegExpQt 5 中已弃用的。所以:

#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
QRegularExpression invalid("[^gatcGATC]");
#else
QRegExp invalid("[^gatcGATC]");
#endif

if (seq.contains(invalid)) {
  qDebug() << "invalid sequence!";
  ...
}
于 2014-07-16T07:52:51.510 回答
0

默认情况下,QRegExp区分大小写。

QRegExp ( const QString & pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive

您应该添加参数以使其不区分大小写。

于 2014-07-14T19:19:25.650 回答
0

误解了 OP 请求。此解决方案用于查找仅包含所有 4 个元素的子序列一次。

由于正则表达式无法计算出现次数,因此您需要检查任何可能的匹配项。使用 2 个字符的简短示例:AB 和 BA。AAABBBAAA 待检查。您将需要使用 QRegExp("(AB|BA)") 因为表达式无法搜索排列。因此,要查找具有每个元素一次的序列,需要对 (ACGT|ACTG|AGCT|....) 进行正则表达式检查

实现类似的东西会更容易:

QString seq = "gactacgtccttacgaccaacggcgataaaaattgcccgcataagacaactttcgaggcg";
QMap<QChar,int> count;

void resetCounter()
{
  count[QChar('a')] = 0;
  count[QChar('c')] = 0;
  count[QChar('g')] = 0;
  count[QChar('t')] = 0;
}

bool checkCounter()
{
  foreach(count.values(), int val)
    if(val != 1)
      return false;
  return true;
}


resetCounter();
for(int i=0; i<seq.length(); i++)
{  
  count[seq.at(i)] = count[seq.at(i)] + 1;
  if(count[seq.at(i)] > 1)
  {
    resetCounter();
    count[seq.at(i)] = 1;
  }
  if(checkCounter())
  {
    //Found sequence
    count[seq.at(i-3)] = 0;
  }
} 

编辑:发现小错误。调用 resetCounter() 后必须将当前元素设置为 1

于 2014-07-15T06:45:27.063 回答