ゼロ幅の正規表現文字列を使用して、有効な切断部位であるアミノ酸記号(基本的には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);