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

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

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

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


person alrawab    schedule 14.07.2014    source источник


Ответы (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!";
  ...
}
person Kuba hasn't forgotten Monica    schedule 16.07.2014
comment
Я думал, что оператор искал последовательность одиночных вхождений, содержащих все элементы (последовательность в этой последовательности). Возможно, поиск, существуют ли недействительные подпоследовательности из-за отсутствия всех 4 элементов. Я, наверное, неправильно понял вопрос, подумав - person Sebastian Lange; 16.07.2014
comment
@SebastianLange, чтобы определить, содержит ли последовательность только определенные символы. Мне кажется, достаточно ясно ... - person Kuba hasn't forgotten Monica; 16.07.2014
comment
Недействительный QRegExp([^GATC],Qt::CaseInsensitive); if (seq.contains(invalid)) { qDebug() ‹‹ недопустимая последовательность!; } - person alrawab; 16.07.2014

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

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

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

person Jay    schedule 14.07.2014
comment
я знаю проблему, не касающуюся CaseSensitivity. - person alrawab; 14.07.2014
comment
QString seq(gactacgtccttacgaccaacggcgataaaaattgcccgcataagacaactttcgaggcg); qDebug()‹‹seq.contains(QRegExp(//[^gatc])); - person alrawab; 14.07.2014

Неправильное понимание запроса OP. Это решение предназначено для поиска подпоследовательностей, содержащих все 4 элемента только один раз.

Поскольку регулярные выражения не могут подсчитывать вхождения, вам нужно будет проверить любое возможное совпадение. Краткий пример с использованием двух символов: AB и BA. ААААВББААА надо проверить. Вам нужно будет использовать 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()

person Sebastian Lange    schedule 15.07.2014