Использование PRXNEXT для захвата всех экземпляров ключевого слова - PullRequest
2 голосов
/ 07 марта 2019

Я просматриваю медицинские записи, чтобы отразить все случаи фразы, в частности «производство карбапенемазы».Иногда эта фраза может встречаться> 1 раз в строке.Из некоторых исследований я думаю, что PRXNEXT был бы наиболее разумным, но мне трудно заставить его делать то, что я хочу.В качестве примера для этой строки:

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

Из приведенного выше комментария я хотел бы извлечь фразы

предполагаемое производство карбапенемаз

и

не подтверждено получение карбапенемазы

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

carba_cnt = count(as_comments,'carba','i');

if _n_ = 1 then do;
retain reg1 neg1;
 reg1 = prxparse("/ca[bepr]\w+ prod/");
end;

start = 1;
stop = length(as_comments);
position = 0;
length = 0;

/* Use PRXNEXT to find the first instance of the pattern, */
/* then use DO WHILE to find all further instances.       */
/* PRXNEXT changes the start parameter so that searching  */
/* begins again after the last match.                     */

call prxnext(reg1, start, stop, as_comments, position, length);

lastpos = 0;
 do while (position > 0);
 if lastpos then do; 
 length found $200;
 found = substr(as_comments,lastpos,position-lastpos);
 put found=;
  output;
 end;
 lastpos = position;

 call prxnext(reg1, start, stop, as_comments, position, length);
 end;

 if lastpos then do;
 found = substr(as_comments,lastpos);
 put found=;
  output;
 end;

1 Ответ

1 голос
/ 07 марта 2019

Вы правильно используете PRXNEXT для определения местоположения каждого совпадения с регулярным выражением в источнике.Шаблон регулярного выражения можно изменить, чтобы использовать групповой захват для поиска необязательного ведущего «не подтверждено».Сценарий наименее вероятного «сбоя кодера» заключается в том, чтобы сфокусировать цикл и извлечь один вызов PRXNEXT.

В этом примере используется шаблон /((not confirmed\s*)?(ca[bepr]\w+ prod)) и выводится по одной строке на совпадение.

data have;
  id + 1;
  length comment $2000;
  infile datalines eof=done;
  do until (_infile_ = '----');
    input;
    if _infile_ ne '----' then 
      comment = catx(' ',comment,_infile_);
  end;
  done:
  if not missing(comment);
  datalines4;
if amikacin results are needed please notify microbiology lab at ext 
for further testing the organism will be held until meropenem result 
obtained by disc diffusion presumptive carbapenemase producing cre 
see spmi for carba r pcr results not confirmed carbapenemase producing cre
----
if amikacin results are needed please notify microbiology lab at ext 
for further testing the organism will be held until meropenem result 
obtained by disc diffusion conjectured carbapenems producing cre 
see spmi for carba r pcr results not confirmed carbapenemase producing cre
----
;;;;
run;

data want;
  set have;
  prx = prxparse('/((not confirmed\s*)?(ca[bepr]\w+ prod))/');

  _start_inout = 1;

  do hitnum = 1 by 1 until (pos=0);
    call prxnext (prx, _start_inout, length(comment), comment, pos, len);
    if len then do;
      content = substr(comment,pos,len);
      output;
    end;
  end;

  keep id hitnum content;
run;

Информация о бонусе: prxparse не обязательно должен быть внутри блока if _n_=1.См. PRXPARSE docs

Если регулярное выражение perl является константой или если используется параметр / o, регулярное выражение Perl компилируется только один раз.Последовательные вызовы PRXPARSE не вызывают перекомпиляцию, но возвращают идентификатор регулярного выражения для уже скомпилированного регулярного выражения.Такое поведение упрощает код, поскольку вам не нужно использовать блок инициализации (IF _N_ = 1) для инициализации регулярных выражений Perl.

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