【问题标题】:Regex: extracting DNA info between 2 markers正则表达式:提取 2 个标记之间的 DNA 信息
【发布时间】:2011-12-07 15:13:38
【问题描述】:

我正在尝试从文件中提取一些 DNA 信息。 在由碱基 GCAT 组成的 DNA 数据之前,有一个词 ORIGIN,在之后有一个 //。如何编写正则表达式来获取这些标记之间的这些碱基?

我尝试了以下方法,但它不起作用。

[ORIGIN(GCATgcat)////]

样本数据:

ORIGIN      
  1 acagatgaag acagatgaag acagatgaag acagatgaag
  2 acagatgaag acagatgaag acagatgaag acagatgaag
//

【问题讨论】:

  • 您能否提供一个输入字符串和预期的输出。
  • 刚刚做到了 :) 从我正在读取的文件中添加了一个示例
  • 请不要使用正则表达式来解析生命形式 :)
  • 啊啊,这是一个全新的水平!

标签: java regex dna-sequence


【解决方案1】:

试试这个模式“\\b([GCATgcat]+)\\b”,它匹配任何被单词边界包围的 GCAT 字符序列(大写或小写)(因此它不会匹配嵌入在其他字符串中的那些字符,例如单词“catalog”)。如果您在示例文件中反复扫描此正则表达式,您将提取每个序列。

这是您的示例文件的工作示例:

// Locate the substring between "ORIGIN" and "//" in the file.
String fileContents = getSampleFileContents();
int indexOfOrigin = fileContents.indexOf("ORIGIN");
String pertinentSection = fileContents.substring(
    indexOfOrigin, fileContents.indexOf("//", indexOfOrigin));

// Search for sequences within the pertinent substring.
Pattern p = Pattern.compile("\\b([GCATgcat]+)\\b");
Matcher m = p.matcher(pertinentSection);
List<String> sequences = new ArrayList<String>();
while (m.find()) {
  sequences.add(m.group(1));
}
sequences.toString(); // => ["acagatgaag", "acagatgaag", ..., "acagatgaag"]

【讨论】:

  • 好吧,我只是这样做了,但它仍然无法正常工作,如果在 origin 和 data 和 data 和 // 之间有一条新线是否重要?
  • @user1044585:是的,匹配字符串中的任何字符,包括空格和换行符都会影响正则表达式。请按照原样使用一些示例数据字符串更新您的问题,因为这是问题的症结所在。
  • 老兄,非常感谢!效果非常好,但是一个问题是在//之后的 DNA 序列后面有句子。所以我最后得到了一些不应该存在的东西。开头也一样。
  • @user1044585:查看我更新后的答案,并举例说明如何识别“ORIGIN”和“//”之间的相关子字符串。
【解决方案2】:

对于我们所有不是正则表达式超级向导的人,我建议采用两步法。删除明显的瑕疵,例如数字和换行符,然后进行匹配。例如

public class Regex {

   static String NL = "\n";
   static String INPUT = "stuff at beginning ORIGIN" + NL + 
   "1 acagatgaag acagatgaag acagatgaag acagatgaag" + NL + NL + 
   "2 acagatgaag acagatgaag acagatgaag acagatgaag" + NL + 
   "// I added stuff here at the end that should be ignored";

   public static void main(String[] args) {
       Pattern removePattern = Pattern.compile("[\\r\\n \\t\\d]+");
       Pattern findPattern = Pattern.compile("ORIGIN[GCATgcat]+//");

       Matcher removeMatcher = removePattern.matcher(INPUT);
       String clean = removeMatcher.replaceAll("");

      Matcher findMatcher = findPattern.matcher(clean);
      if ( findMatcher.find()) {
         System.out.println(findMatcher.group());
      }
   }
}

【讨论】:

  • 附注- 您可能需要在可能的碱基中添加“U”和“u”以覆盖 RNA。
  • 这不是我从文件中读取数据的理想解决方案。不过谢谢
  • 我必须从某个地方获取演示代码的字符串。显然,您会在真实代码中从文件中读取它。您接受的代码也只使用一个字符串!此代码对错误更健壮 - 如果文件不包含“ORIGIN”@maerics 代码将爆炸。此外,通过少量工作(while 循环),我的代码可以在文件中找到多个序列。许多 DNA 数据库文件包含多个序列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多