2

ゼロ幅の正規表現文字列を使用して、有効な切断部位であるアミノ酸記号(基本的にはAZ)の文字列内の場所を指定します。たとえば、タンパク質分解酵素トリプシンは、P((?<=[KR])(?!P))が続く場合を除いて、KまたはRの後に切断します。これらの正規表現を、この分野でも一般的な「カット/ノーカット」表記に変換したいと思います。たとえば、トリプシンは「KR」の後に「P」のノーカットでカットします。これに対する私の最初の試みは、単純なケースで機能します。

// match zero or one regex term like (?<=[KR]) or (?<=K) or (?<![KR]) or (?<!K)
// followed by zero or one term like (?=[KR]) or (?=K) or (?![KR]) or (?!K)
boost::regex cutNoCutRegex("(?:\\(+\\?<([=!])(\\[[A-Z]+\\]|[A-Z])\\)+)?(?:\\(+\\?([=!])(\\[[A-Z]+\\]|[A-Z])\\)+)?");

C ++をエスケープしないと、次のようになります。

(?:\(+\?<([=!])(\[[A-Z]+\]|[A-Z])\)+)?(?:\(+\?([=!])(\[[A-Z]+\]|[A-Z])\)+)?

これを変更して、複数の文字、非キャプチャグループ、文字セット、文字セットの範囲、否定セット、文字列の開始/終了など、やや複雑な正規表現をサポートしたいと思います: (?<=K|R)または(?<=(?:K)|(?:R))または(?<=[^A-JL-QS-Z])または(?<=^M|[KR])

これらの追加機能は、正規表現の複雑さを爆発させるように思われます。Boost.Regexの「実験的な」BOOST_REGEX_MATCH_EXTRA機能を有効にする必要があると確信しています。私がしていることをするためのより良い方法はありますか?ゼロ幅の正規表現で他の正規表現の可能性を見逃していますか?

これは、単純なケースの多くをカバーする既存のコードの単体テストの擬似コードです。「センス」メンバーは、「カット」フィールドが後読みに対応する場合は「C」であり、「カット」フィールドが先読みに対応する場合は「N」です。現在のpepXMLSpecificity()関数は、より短いリストを生成する場合、文字セットを反転できます。

struct PepXMLSpecificity { std::string cut, no_cut, sense; };
void unit_assert_equal(string expected, string actual);

"(?<=[QWERTY])(?=[QWERTY])"
result = pepXMLSpecificity(ez);
unit_assert_equal("C", result.sense);
unit_assert_equal("QWERTY", result.cut);
unit_assert_equal("ABCDFGHIJKLMNOPSUVZ", result.no_cut);

"(?<![QWERTY])(?![QWERTY])"
result = pepXMLSpecificity(ez);
unit_assert_equal("C", result.sense);
unit_assert_equal("ABCDFGHIJKLMNOPSUVZ", result.cut);
unit_assert_equal("QWERTY", result.no_cut);

"(?<=[QWERTY])"
result = pepXMLSpecificity(ez);
unit_assert_equal("C", result.sense);
unit_assert_equal("QWERTY", result.cut);
unit_assert_equal("", result.no_cut);

"(?=[QWERTY])"
result = pepXMLSpecificity(ez);
unit_assert_equal("N", result.sense);
unit_assert_equal("QWERTY", result.cut);
unit_assert_equal("", result.no_cut);

"(?<![QWERTY])"
result = pepXMLSpecificity(ez);
unit_assert_equal("C", result.sense);
unit_assert_equal("ABCDFGHIJKLMNOPSUVZ", result.cut);
unit_assert_equal("", result.no_cut);

"(?![QWERTY])"
result = pepXMLSpecificity(ez);
unit_assert_equal("N", result.sense);
unit_assert_equal("ABCDFGHIJKLMNOPSUVZ", result.cut);
unit_assert_equal("", result.no_cut);

// the following tests aren't supported yet

"(?<=^M)|(?<=[KR])"
unit_assert_equal("N", result.sense);
unit_assert_equal("KR", result.cut); // the 'M' part is dropped
unit_assert_equal("", result.no_cut);

"(?<=K|R)"
unit_assert_equal("C", result.sense);
unit_assert_equal("KR", result.cut);
unit_assert_equal("", result.no_cut);

"(?<=(?:K)|(?:R))"
unit_assert_equal("C", result.sense);
unit_assert_equal("KR", result.cut);
unit_assert_equal("", result.no_cut);

"(?<=[^A-JL-QS-Z])(?!P)"
unit_assert_equal("C", result.sense);
unit_assert_equal("KR", result.cut);
unit_assert_equal("P", result.no_cut);
4

1 に答える 1

1

私が理解しているように、あなたは既存の正規表現のライブラリを持っており、これをミニオ酸配列の一般的な文字列表現に適用すると、タンパク質分解酵素の推定カットポイントを特定します。

正規表現によって暗示されるカットポイントの標準のテキスト記述を自動的に生成する必要があります。

観察:

  • 任意の正規表現を解析できる必要はありません。ライブラリに実際にあるケースのみを解析できる必要があります。

  • 必ずしもすべてを解析する必要はありません。特に難しいものは、あまり多くない限り、手作業で追い出して行うことができます。

本当に次のことをする必要があると思います。

  1. pepXMLSpecificityは、1つ以上の説明、つまり、を返す必要がありますvector<struct PepXMLSpecificity>。これは、正規表現を作成して任意の正規表現を組み合わせることができるためです。jpalacekのコメント。

  2. 正規表現のライブラリの実際の内容に取り組み、一般的なケースから始めて、すべて(または少なくとも上司を満足させるのに十分な数)になるまで、一般的なタイプの正規表現ごとに特別なケースを追加する必要があります。

于 2012-01-19T15:17:09.963 に答える