Сопоставление и удаление повторяющейся группы слов с использованием REGEX в SAS - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь удалить группу повторяющихся слов в SAS. По сути, я пытаюсь удалить набор слов, которые повторяются. Косая черта - это разделитель. Я использую SAS 9.4 и у меня есть следующий пример:

Я попробовал приведенное выше регулярное выражение, и оно работает для «Боль в лимфатических узлах / Боль в лимфатических узлах / Боль в конечностях». Результат - «Боль в лимфатических узлах / Боль в конечностях». Однако это не работает для «Боль в лимфатических узлах / Боль в конечностях / Боль в конечностях» и «Боль в лимфатических узлах / Невралгия / Невралгия». Я не уверен почему.

data have;
  string = 'Lymph node pain/Pain in extremity/Pain in extremity';output;
  string = 'Lymph node pain/Lymph node pain/Pain in extremity'; output;
  string = 'Lymph node pain/Neuralgia/Neuralgia'; output;
run;

data test;
  set have;
     _1=prxparse('s/([A-Za-z].+?\s.*?\/.*?)(.*?)(\1+)/\2\3/i');
     _2=prxparse('/([A-Za-z].+?\s.*?\/.*?)(.*?)(\1+)/i');
    do i=1 to 10;
        string=prxchange(_1, -1, strip(string));
        if not prxmatch(_2, strip(string)) then leave;
    end;
   drop i  ;
run;

Любая помощь приветствуется.

1 Ответ

1 голос
/ 12 июня 2019

Вот подход, основанный на scan.Я предположил, что у вас есть максимум 3 фразы на строку, но это легко можно настроить, чтобы работать с любым количеством фраз, если это необходимо.

data have;
  string = 'Lymph node pain/Pain in extremity/Pain in extremity';output;
  string = 'Lymph node pain/Lymph node pain/Pain in extremity'; output;
  string = 'Lymph node pain/Neuralgia/Neuralgia'; output;
  string = 'Neuralgia/Lymph node pain/Neuralgia'; output;  /*Added A/B/A example*/
run;

data test;
  set have;
  array phrases[3] $32;
  /*Separate string into an array of phrases delimited by / */
  do i = 1 to dim(phrases);
    phrases[i] = scan(string,i,'/');
  end;
  /*Sort the array so that duplicate phrases are next to each other*/
  call sortc(of phrases[*]);
  /*Iterate through the array and build up an output string of non-duplicates*/
  length outstring $255;
  do i = 1 to dim(phrases);
    if i = 1 then outstring = phrases[1];
    else if phrases[i] ne phrases[i-1] then outstring = catx('/',outstring,phrases[i]);
  end;
  keep string outstring;
run;

У этого есть побочный эффект сортировки всех фразв алфавитном порядке, а не в порядке первого появления в строке.

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