Regex: извлечение информации о ДНК между 2 маркерами - PullRequest
1 голос
/ 07 декабря 2011

Я пытаюсь извлечь некоторую информацию ДНК из файла. Перед данными ДНК, состоящими из основ ГКАТ, стоит слово ORIGIN, а после стоит //. Как мне написать регулярное выражение, чтобы получить эти базы между этими маркерами?

Я пробовал следующее, но оно не работает.

[ORIGIN(GCATgcat)////]

Пример данных:

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

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Попробуйте этот шаблон "\\b([GCATgcat]+)\\b", который соответствует любой последовательности символов GCAT (в верхнем или нижнем регистре), окруженной границей слова (поэтому он не будет совпадать с теми символами, встроенными в другие строки, как слово "каталог").Если вы неоднократно сканируете это регулярное выражение в файле примера, вы извлечете каждую последовательность.

Вот рабочий пример для файла примера:

// 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"]
0 голосов
/ 07 декабря 2011

Для всех нас, кто не является супер-волшебником, я бы предложил двухэтапный подход.Удалите очевидные ошибки, такие как цифры и символы новой строки, затем сделайте совпадение.например,

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());
      }
   }
}
...