RegEx для MetaMap в Java - PullRequest
       21

RegEx для MetaMap в Java

0 голосов
/ 28 апреля 2010

Файлы MetaMap имеют следующие строки:

mappings([map(-1000,[ev(-1000,'C0018017','Objective','Goals',[objective],[inpr],[[[1,1],[1,1],0]],yes,no)])]).

Формат поясняется как

mappings(
      [map(negated overall score for this mapping, 
            [ev(negated candidate score,'UMLS concept ID','UMLS concept','preferred name for concept - may or may not be different',
                 [matched word or words lowercased that this candidate matches in the phrase - comma separated list],
                 [semantic type(s) - comma separated list],
                 [match map list - see below],candidate involved with head of phrase - yes or no,
                 is this an overmatch - yes or no
               )
            ]
          )
      ]
    ).

Я хочу выполнить запрос RegEx в java, который даст мне Strings «Идентификатор концепции UMLS», семантический тип и список сопоставлений. Является ли RegEx подходящим инструментом или как наиболее эффективный способ сделать это в Java?

Ответы [ 3 ]

3 голосов
/ 28 апреля 2010

Вот моя попытка найти регулярное выражение.Эта replace методология "мета-регулярного выражения" - это то, с чем я экспериментирую;Я надеюсь , что он читает в более читаемый код.

String line = "mappings([map(-1000,[ev(-1000,'C0018017','Objective','Goals',[objective],[inpr],[[[1,1],[1,1],0]],yes,no)])]).";
String regex = 
    "mappings([map(number,[ev(number,<quoted>,quoted,quoted,[csv],[<csv>],[<matchmap>],yesno,yesno)])])."
    .replaceAll("([\\.\\(\\)\\[\\]])", "\\\\$1") // escape metacharacters
    .replace("<", "(").replace(">", ")") // set up capture groups
    .replace("number", "-?\\d+")
    .replace("quoted", "'[^']*'")
    .replace("yesno", "(?:yes|no)")
    .replace("csv", "[^\\]]*")
    .replace("matchmap", ".*?")
;
System.out.println(regex);
// prints "mappings\(\[map\(-?\d+,\[ev\(-?\d+,('[^']*'),'[^']*','[^']*',\[[^\]]*\],\[([^\]]*)\],\[(.*?)\],(?:yes|no),(?:yes|no)\)\]\)\]\)\."

Matcher m = Pattern.compile(regex).matcher(line);
if (m.find()) {
    System.out.println(m.group(1)); // prints "'C0018017'"
    System.out.println(m.group(2)); // prints "inpr"
    System.out.println(m.group(3)); // prints "[[1,1],[1,1],0]"
}

Это replace мета-регулярное выражение позволяет легко размещать пробелы между символами, просто устанавливая соответствующий replace (вместо этогоразбрасывать все это в один нечитаемый беспорядок).

1 голос
/ 28 апреля 2010

Возможно, да.

Что-то вроде (при условии, что указанные вами значения являются единственными местами, где кавычки являются допустимыми, значения, к которым вы добавили [], являются единственными допустимыми местами, что символы '[' и ']' не присутствовать внутри значений, которых в списке карт совпадений не должно быть]], кроме как в конце. Вы получаете картину - много предположений ...)

^[^']+?'([^']*+)'[^\[]+\[[^]]+\],\[([^\]]*?)\],\[\[(.*?)\]\].*$

Что должно дать вам эти три поля в качестве трех подходящих групп (проверено на вашем примере с http://www.regexplanet.com/simple/index.html)

Что есть-

"^[^']+?'([^']*+)'[^\\[]+\\[[^]]+\\],\\[([^\\]]*?)\\],\\[\\[(.*?)\\]\\].*$"

как строка Java. , .

Но это не очень поддерживаемо. Вероятно, было бы лучше быть более многословным с этим!

1 голос
/ 28 апреля 2010

Это действительно волосатый формат. Regex звучит как путь, но у вас будет действительно волосатое регулярное выражение:

mappings\(\[map\(-?[0-9.]+,\[ev\(-?[0-9.]+,'(.*?)','.*?','.*?',\[.*?\],\[(.*?)\],\[(.*)\],(?:yes|no),(?:yes|no)\)\]\)\]\)\.

Становится хуже, когда вы должны выражать регулярное выражение в виде строки Java - как всегда, вы будете заменять каждые \ на \\. Но это должно дать вам то, что вы хотите; соответствующие группы 1, 2 и 3 - это строки, которые вы хотите вытащить. Обратите внимание, что я не проверил это строго против искаженного ввода, потому что у меня не хватает на это желания. :)

В образовательных целях: несмотря на его внешний вид, на самом деле это было совсем не сложно построить - я просто взял вашу строку выборки и заменил фактические значения соответствующими подстановочными знаками, стараясь не выходить за скобки, скобки и точка в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...