私は、タンパク質の非常に大きな .txt ファイル データベースを使用して Java で作業しています。タンパク質には一般的な構造がありますが、「これを startIndex から endIndex に変換し、逆にして置換する」をハードコードするほど均一な構造ではありません。唯一の真の統一性は、それらが で区切られていることです>
。
...WERINWETI>gi|230498 [Bovine Albumin]ADFIJWOENAONFOAIDNFKLSADNFATHISDATFDAIFJ>sp|234235 (human) AGP1 QWIQWONOQWNROIWQRNOQWIRNSWELLE>gi|...
等々。
ご覧のとおり、実際のタンパク質配列 (すべての大文字の長い鎖) は大文字の鎖であるという点で統一されていますが、それ以外にも、前述の説明はほとんど何でもかまいません (多くの場合、スペースではありません)。説明とシーケンスの間)。私のプログラムが行う必要があるのは、元のテキストを新しいファイルにコピーしてから、通過し、r-
それぞれの後に>
(例: ...EERFDS>r-gi|23423...
) を追加し、大文字のチェーンのみを逆にすることです。そのプロセスが完了したら、元のテキストの末尾に追加する必要があります。
私はr-
機能を完了しました。実際に反転と追加も完了しましたが、十分に効率的ではありません。この処理を受けているデータベースは大規模であり、私のプログラムは時間がかかりすぎます。実際、私はそれを終わらせたことがないので、どれくらいの時間がかかるかわかりません. 1時間待って終了。正規表現 (組み込みの Pattern クラス) を使用した反転のアルゴリズムは次のとおりです (計算量の多い部分)。
Pattern regexSplit = Pattern.compile(">");
String[] splits = regexSplit.split(rDash.toString());
StringBuilder rDashEdited = new StringBuilder();
Pattern regexProtein = Pattern.compile("[A-Z]{5,}");
for (int splitIndex = 1; splitIndex < splits.length; splitIndex++) {
Matcher rDashMatcher = regexProtein.matcher(splits[splitIndex]);
rDashMatcher.find();
StringBuffer reverser = new StringBuffer(rDashMatcher.group());
rDashEdited.append(rDashMatcher.replaceAll(reverser.reverse().toString()) + ">");
}
System.out.println(">" + rDashEdited);
したがって、基本的にはrDash
(元のすべてのタンパク質を含む StringBuilder ですが、>r-
まだ反転していません) を個々のタンパク質に分割し、それらを String 配列に追加します。次に、配列内の各文字列を調べて、5 文字を超える一連の大文字を探し、一致するものを StringBuffer に追加し、それを逆にして、順方向バージョンを逆方向バージョンに置き換えます。このアルゴリズムは、小さなテキスト ファイルに対して意図したとおりに機能することに注意してください。
配列を分割/トラバースする必要をなくす、より強力な正規表現はありますか? 私が試したとき、replaceAll()
コールは下流のすべてのタンパク質をセット内の最初のタンパク質の逆に置き換えました. 楽しみのためにチェックしたところ、セット内の各タンパク質のSystem.out.println(rDashMatcher.groupCount())
aが出力されました。0
より効率的/強力な正規表現を手伝ってくれる人はいますか? これは私にとってかなり新しい概念ですが、MATLAB でのベクトル化 (文字のみ) を思い出させます。