QRegExp соответствуют определенным буквам?

Я работаю с последовательностями ДНК, РНК и белка и QRegExp мне не удается определить, содержит ли последовательность только определенные символы. Например, однозначный содержит только acgt:

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

Не работает для меня Как я могу это исправить?

3 ответа

Решение

Вы ищете, содержит ли последовательность символы кроме gatc, Вы также не должны использовать устаревшие QRegExp в Qt 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!";
  ...
}

По умолчанию QRegExp чувствителен к регистру.

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

Вы должны добавить параметр, чтобы сделать его без учета регистра.

Непонимание запроса ОП. Это решение для поиска подпоследовательностей, содержащих только все 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;
  }
} 

Изменить: Обнаружена небольшая ошибка. Должен установить текущий элемент в 1 после вызова resetCounter()

Другие вопросы по тегам