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()