regex SAS使用PRX查找字符串模式

carvr3hs  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(184)

我有一个SAS数据集,其中包含单个变量中包含PDF文本的多个观察结果。
我需要用下面的模式解析字符串以便进一步处理。

txt="ABCCXX.DEFG hijkj LMNO = YYYYYYYY"
  • XX可以是A-Z(大写)中的任意字符(始终为2个字符)
  • YYYYYYYY可以是A-Z(大写)中的任何字符或0到9中的任何数字(最多8个字符,包括数字(如果存在);但可以小于8)
  • 提到的其他字符总是相同的(即第一个字符总是A,第二个总是B,依此类推)。
  • 字符串结束后总是有一个白色(也许这有助于搜索)。
  • 这个字符串可以多次出现。我需要每个出现在一个单独的变量

由于我对PRX函数的知识有限,我只能想出以下方法。显然,它不能处理我上面提到的'b'和'e'。

data want;
   set have;
   length var8 $200;
   search8 = prxparse("/[A][B][C][C][A-Z][A-Z][.][D][E][F][G][\s][h][i][j][k][j][\s][L][M][N][O][\s][=][\s][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z]/oi");
   if prxmatch(search8,txt) then do;
     call prxsubstr(search8,txt,start,length);
     if start>0 then var8=substr(txt,start,length);
   end;
run;
igetnqfo

igetnqfo1#

当只有一个字符时,不需要[]字符类。
您需要一个模式,其中()捕获组用于提取,{a,b}用于出现范围。该模式可以通过PRXNEXT在循环中多次应用。
示例:

data work.have;
  length line $256;
  input;
  line = _infile_;
datalines4;
txt="ABCCPQ.DEFG hijkj LMNO = 123456AB"
txt="ABCCVW.DEFG hijkj LMNO = ZZZZZZZZ"; txt="ABCCXY.DEFG hijkj LMNO = 12"
;;;;

data want;
  rx = prxparse('m/"ABCC([A-Z]{2})\.DEFG hijkj LMNO = ([A-Z0-9]{1,8})"/');

  set work.have;

  length found $256;

  start = 1;
  stop = length(line);
  do index = 1 by 1;
    call prxnext(rx, start, stop, line, pos, length);
    if pos = 0 then leave;
    found = substr(line, pos, length);
    xx = prxposn(rx,1,line);
    yy = prxposn(rx,2,line);
    put pos= found= xx= yy=;
  end;
run;

将日志

pos=5 found="ABCCPQ.DEFG hijkj LMNO = 123456AB" xx=PQ yy=123456AB
pos=5 found="ABCCVW.DEFG hijkj LMNO = ZZZZZZZZ" xx=VW yy=ZZZZZZZZ
pos=46 found="ABCCXY.DEFG hijkj LMNO = 12" xx=XY yy=12

相关问题