我正在使用非常大的 .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-
放入,但还没有经历反转)分成每个单独的蛋白质并将它们添加到一个字符串数组中。然后我遍历数组中的每个字符串并查找长度超过 5 个字母的大写字母链,将匹配项添加到 StringBuffer,反转它,并将正向版本替换为反向版本。请注意,此算法适用于较小的文本文件。
是否有更强大的正则表达式可以消除拆分/遍历数组的需要?当我尝试时,该replaceAll()
调用将所有下游蛋白质替换为集合中 FIRST 蛋白质的反面。为了好玩,我检查了一下,System.out.println(rDashMatcher.groupCount())
它为集合中的每种蛋白质打印了一个0
。任何人都可以帮助我使用更有效/更强大的正则表达式吗?这对我来说是一个相当新的概念,但它让我想起了 MATLAB 中的矢量化(仅使用字母)。