gpt4 book ai didi

regex - 使用正则表达式将字符串拆分为多个变量 SAS

转载 作者:行者123 更新时间:2023-12-02 16:02:09 28 4
gpt4 key购买 nike

我对 SAS 中正则表达式的使用有疑问。

我的数据集是这样的:

<表类="s-表"><头>身份证代码<正文>101K2K5K8F10F26F2102L7P13P4103L1

我希望它看起来像这样:

<表类="s-表"><头>身份证代码<正文>101K2101K5101K8101F10101F26101F2102L7102第13页102P4103L1

一开始我认为先分配新的列然后按行分配会更容易。

我的尝试如下所示:

proc ds2;
data Codes (overwrite=yes);
dcl char(16) code1 code2 code3 code4 code5 code6;
dcl double re;
keep code1 code2 code3 code4 code5 code6;
retain re;

method init();
dcl varchar(32) expression;
expression = '/(\w+\d+)+/';
re=prxparse(expression);
if missing( re ) then do;
put 'ERROR: Invalid expression ' expression;
stop;
end;
end;



method run();
set mytable;
code1 = 'ERROR';
if prxmatch(re, Code) then
do;
code1=prxposn(re, 0, Code);
code2=prxposn(re, 1, Code);
code3=prxposn(re, 2, Code);
code4=prxposn(re, 3, Code);
code5=prxposn(re, 4, Code);
code6=prxposn(re, 5, Code);
end;
else do;
code1='0';
end;
end;
enddata;
run;
quit;

proc print data=Codes;
run;
quit;

然而,什么都没有改变。结果,我得到了 code1 和 code2 列,就像初始数据集中的 Code 列一样被填充。我真的很感激任何帮助,因为正则表达式不是我的强项。我还将 code1 = 'ERROR' 和后来的 code1 = '0' 放在一起,以检查代码是否有效。

需要注意的是,我创建了 code6 作为试用。我不知道每个 ID 的确切代码数。但是,我确实知道代码必须始终是一个字母与一位或两位数字的组合,它也可以采用 Z12-9 的形式(因此一个字母后跟两位数字,然后是破折号,然后是一位数字).

提前致谢!

最佳答案

回答这个正则表达式部分,你的正则表达式是错误的,我认为 prxposn 可能也是错误的。

\w 匹配数字和 alpha,因此 \w+ 将获取所有字符串。您需要使用 [A-Z] 或使用 \w+? 来使用较不积极的匹配来仅获取单个 alpha-then-numeric 集。

此外,这里正确的方法是调用prxnextprxposn匹配正则表达式中中的每个括号匹配,所以1是第一个, 2 是第二个,但 (something)+ 只有一个括号匹配。 call prxnext 将继续查找单个匹配项的更多匹配项,您可以使用它来获取匹配位。

这里也是简单的数据步骤,但 DS2 会类似。

data want;
set have;
rx = prxparse('/[A-Z]+\d+/ios');

start = 1;

do until (pos eq 0);
call prxnext(rx,start,length(code),code,pos,len);
if pos gt 0 then do;
w = substr(code,pos,len);
put w=;
output;
end;
end;
run;

关于regex - 使用正则表达式将字符串拆分为多个变量 SAS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70394683/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com