我有variable1
字符串,例如"asdfsad What do you do", "qwer What is your name", "Zebra"
variable2
字符串为"asdfsad", "qwer", "Animal"
如果它与variable2
中的单词相等,我想从variable1中的字符串中删除第一个单词。到目前为止,我唯一能想出的就是分别替换每个单词:
即。 variable1=tranwrd(variable1, "asdfsad", "");
等等。但是我有很多词需要替换。
非常感谢你的帮助。
答案 0 :(得分:2)
这样的事情怎么样:
data sample;
length variable1 variable2 $100;
variable1= "asdfsad What do you do"; variable2 = "asdfsad"; output;
variable1= "qwer What is your name"; variable2 = "qwer"; output;
variable1= "Zebra" ; variable2 = "Animal"; output;
run;
data fixed;
length first_word $100;
set sample;
first_word = scan(variable1,1);
if first_word eq variable2 then do;
start_pos = length(first_word) + 1;
variable1 = substr(variable1,start_pos);
end;
run;
这适用于匹配整个第一个单词。它会在剩余的文本中留下空格或其他标点符号,但如果您愿意,您应该可以轻松更改。
如果您的问题是逐个字符而不是整个第一个单词匹配那么这将是一个非常不同的问题,我建议发布一个新问题。
答案 1 :(得分:0)
如果您对tranwrd的结果感到满意,也可以使用它。你只需要小心空白
variable1 = strip(tranwrd(variable1, strip(variable2), ''));
答案 2 :(得分:0)
if scan(variable1,1)=variable2 then
variable1=substr(variable1,index(variable1," "));
答案 3 :(得分:0)
对于数千个单词,这可能不会有效或可行,但您可以通过prxchange
使用Perl正则表达式(例如s/search/replacement/
)
/* words to match delimited by "|" */
%let words = asdfsad|qwer|Animal|foo|bar|horse;
/* example data */
data example;
infile datalines dlm=',' dsd;
input string: $256.;
datalines;
asdfsad What do you do
qwer What is your name
Zebra
food is in the fridge
foo A horse entered a bar
;
run;
/* cleaned data */
data example_clean;
set example;
/*
regular expression is:
- created once on first row (_n_ = 1)
- cached (retain regex)
- dropped at the end (drop regex).
*/
if _n_ = 1 then do;
retain regex;
drop regex;
regex = prxparse("s/^(&words)\s+//");
end;
string = prxchange(regex, 1, string); /* apply the regex (once) */
run;
正则表达式中的^
符号(在prxparse
中构建)确保它仅在单词的开头匹配,|
符号使其成为'或'匹配, \s+
匹配一个或多个空白字符(这就是为什么在我的例子中,“食物”不匹配)。