首页 > 解决方案 > SAS:任何语言中单词字符的正则表达式

问题描述

假设您有可用的 Twitter 数据。

例如,有以下推文:

RT @Mydy_Rabycad:(评论中的英语)TRACK #1 Mantra,neboli posvátné slovo,které je třeba si opakovat a nezapomínat。Ať se děje cokoli…</p>

清洁它以进行进一步处理

clean_text = prxchange("s/[^\w#@]/ /",-1,text);

RT @Mydy_Rabycad 英语评论 TRACK #1 Mantra neboli posv tn slovo kter je t eba si opakovat a nezapom nat A se d je cokoli

如您所见,一个人正在丢失许多有价值的单词字符。我想得到的是:

RT @Mydy_Rabycad 英语评论 TRACK #1 Mantra neboli posvátné slovo které je třeba si opakovat a nezapomínat Ať se děje cokoli

一般来说,我想删除不属于任何语言的任何单词的所有额外字符,例如标点符号、表情符号等……目标是标记一些随机的 Twitter 数据。

所以示例代码(不起作用)将是

data have;
infile datalines4 delimiter='\\\\\';
length text $200.;
input text $;
datalines4;
RT @Mydy_Rabycad: (English in comments) TRACK #1 Mantra, neboli posvátné slovo, které je třeba si opakovat a nezapomínat. Ať se děje cokoli…
;;;;
run;

data have2;
set have;
clean_text = prxchange("s/[^\w#@]/ /",-1,text);
/*Remove multiple blanks introduced through the above regex*/
clean_text = prxchange("s/\s+/ /",-1,clean_text);
run;

那么在 SAS (9.4 T1M6) 中是否有一个控制序列,例如英语的 \w,即类似于 \p{L} 的东西,它允许对每种语言中的每个字母数字字母进行子集化?

正如评论中所建议的,以下正则表达式也不起作用

prxchange("s/(u?)[^\w#@]/ /",-1,text);
prxchange("s/[^\p{L}#@]/ /",-1,text);

此外,使用 'ka' 修饰符的 compress 函数也不会产生所需的结果。

compress(text,' ','ka');

这个问题与这个有关,但与SAS有关。

标签: regexsas

解决方案


长版:

只需继续将要保留的特殊字符添加到"abcdefghijklmnopqrstuvwxyz_@#áéříťě". 干杯!

 Data want; 
    set have;
      New_text=compress(text,"abcdefghijklmnopqrstuvwxyz_@#áéříťě","kis");
 run;
     /* 'k' keeps the characters in the list instead of removing them.
        'i'  ignores the case of the characters to be kept or removed.
        's' adds space characters (blank, horizontal tab, vertical tab, carriage return, line feed, and form feed) to the list of characters.*/

精简版:

这将删除您添加/替换的任何字符"():."

Data want; 
   set have;
     New_text=compress(text,"():.","i");
 run;

推荐阅读