gpt4 book ai didi

regex - SAS 使用 prxchange 或 prxpson(prxmatch(prxparse())) 从字符串中提取子字符串

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

2 个解决方案贴在底部

我的代码

    data test;  
extract_string = "<some string here>";
my_result1 = prxchange(cat("s/^.*", extract_string, ".*$/$1/"), -1, "A1M_PRE");
my_result2 = prxchange(cat("s/^.*", extract_string, ".*$/$1/"), -1, "AC2_0M");
my_result3 = prxchange(cat("s/^.*", extract_string, ".*$/$1/"), -1, "GA3_30M");
my_result4 = prxchange(cat("s/^.*", extract_string, ".*$/$1/"), -1, "DE3_1H30M");
run;

期望的结果

提取_之后的数字但在 M 之前在具有 M 的字符串中在最后。结果集应该是:

    my_result1 = ""  
my_result2 = "0"
my_result3 = "30"
my_result4 = "30"

以下extract_string值(value)观失败

"\.*(\d*)M\b\"  
"\.*(\d*?)M\b\"
"\.*(\d{*})M\b\"
"\.*(\d{*?})M\b\"
"\.*(\d){*}M\b\"
"\.*(\d){*?}M\b\"

"\.*(\d+)M\b\"
"\.*(\d+?)M\b\"
"\.*(\d{+})M\b\"
"\.*(\d{+?})M\b\"
"\.*(\d){+}M\b\"
"\.*(\d){+?}M\b\"

"\.*(\d+\d+)M\b\"

我会请求帮助的潜在解决方案

  • 也许我只是没有测试正确的 extract_string然而。想法?
  • 也许是我的cat("s/&.*", extract_string, ".*$/$1/")需要修改。想法?
  • 也许我需要使用 prxpson(prxmatch(prxparse()))而不是 prxchange .这将如何制定?

我看过但未能成功实现的链接

https://support.sas.com/rnd/base/datastep/perl_regexp/regexp-tip-sheet.pdf

https://www.pharmasug.org/proceedings/2013/CC/PharmaSUG-2013-CC35.pdf

SAS PRX to extract substring please

extracting substring using regex in sas

Extract substring from a string in SAS

解决方案

方案一

cat 中的后缀函数和 extract_string被修改了。

    data test;  
extract_string = "?(?:_[^_r\n]*?(\d+)M)?$";
my_result1 = prxchange(cat("s/^.*", extract_string, "/$1/"), -1, "A1M_PRE");
my_result2 = prxchange(cat("s/^.*", extract_string, "/$1/"), -1, "AC2_0M");
my_result3 = prxchange(cat("s/^.*", extract_string, "/$1/"), -1, "GA3_30M");
my_result4 = prxchange(cat("s/^.*", extract_string, "/$1/"), -1, "DE3_1H30M");
run;

解决方案2

此解决方案使用另一个 prx -家庭功能:prxparse , prxmatch , 和 prxposn .

data have;
length string $10;
input string;
datalines;
A1M_PRE
AC2_0M
GA3_30M
DE3_1H30M
;

data want;
set have;

rxid = prxparse ('/_.*?(\d+)M\s*$/');

length digit_string $8;

if prxmatch (rxid, string) then digit_string = prxposn(rxid,1,string);

number_extracted = input (digit_string, ? 12.);
run;

最佳答案

我知道 SAS 可以使用 Perl 的正则表达式引擎。后者支持\K,它指示引擎丢弃到目前为止匹配的所有内容,并将匹配的起点重置为当前位置。因此,以下正则表达式应匹配感兴趣的子串数字。

_.*?\K\d+(?=M$)

Demo

匹配失败将被解释为已匹配空字符串。

关于regex - SAS 使用 prxchange 或 prxpson(prxmatch(prxparse())) 从字符串中提取子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62296848/

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