Реализация отрицательного просмотра назад с использованием синтаксиса PRX в SAS

Я начал использовать код PRX в SAS для идентификации фраз свободного текста, введенных в базу данных, которую я использую. Типичная фраза, которую я идентифицирую, это: «положительный модифицированный тест Ходжа» или «положительный результат модифицированного теста Ходжа». Иногда эти фразы встроены в большие строки текста. Чего я не хочу отмечать, так это фраз, которые говорят «предыдущий положительный тест на ходж». Я читал некоторую документацию, чтобы реализовать отрицательный взгляд назад, чтобы НЕ помечать фразы, которые включают «предыдущий», но это не делает то, что я ожидал.

если prxmatch("/pos\w+ (for)?(by)?\s?(the)?\s?(modi|hod|mht)/i") > 0, то hodge_id = 1;

Приведенный выше код PRX будет соответствовать всем нижеприведенным фразам: «положительный результат модифицированного теста ходжа» «предыдущий положительный тест ходжа» «подтвержденный положительный результат карбапенемазы ходжа» «положительный результат модифицированного теста ходжа» «положительный результат модифицированного теста ходжа»

if prxmatch("/pos\w+ (for)?(by)?\s?(the)?\s?(modi|hod|mht)/i") > 0 then 
hodge_id = 1; /* Without lookback */

if prxmatch("/(?<!previous)\s*pos\w+ (for)?(by)?\s?(the)?\s? 
(modi|hod|mht)/i") > 0 then hodge_id = 1; /* With lookbook */

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

но не: "предыдущий положительный тест Ходжа"

Что происходит, так это то, что он опускает фразу, включающую «предыдущий», но также и первую фразу «положительно модифицированная ходж».

Мой PRX находится на начальной стадии, поэтому любые советы по его очистке/упрощению приветствуются.


person Brian Bartle    schedule 26.01.2019    source источник
comment
Забыл добавить, что этот сайт (regex101.com/r/pT0mP7/2) был спасатель.   -  person Brian Bartle    schedule 26.01.2019


Ответы (1)


ты был довольно близок.

  /* 
    you need to have
    (?<!previous\s) or (?<!previous)\s
    instead of (?<!previous)\s* 
   */

 data have;
  length string $200.;
  infile datalines;
   input string & $ ;
 datalines;
  this is cool and nice positive modified hodge wow so nice
   this is wow confirmed positive hodge carbapenemase
 now this positive for modified hodge test and later 
cool is my name positive by the modified hodge hello
 wow and wow previous positive hodge test
 Mr cool
  ;

  data want;
set have;
if _N_ = 1 then 
  do;
  retain patternID;
  pattern = "/(?<!previous\s)pos\w+ (for)?(by)?\s?(the)?\s?(modi|hod|mht)/i";
  patternID = prxparse(pattern);
   end;
  if prxmatch(patternID,string) > 0 then 
 hodge_id = 1;
else hodge_id =0;
drop pattern patternid;
run;

введите здесь описание изображения

person Kiran    schedule 26.01.2019