2015-08-26 222 views
1

我试图从R中的字符串矢量中删除一些不需要的文本,但未能实现我所需的输出。用空格替换字符串

我想消除任何出现的单词,这可能会出现在任何几个变化。采取作为例如:

a<-c("xyz (ALTERNA)","jqk(ALTERNA)","abc(ALTERNO)","def (ALTERNO)","mno (ALTERNO)","pqr (ALTERNA) ") 

欲消除与括号和任何前述空间中的字altern[ao]的任何发生,所以我尝试:

gsub(pattern = "[:blank:]*\\(altern[ao]\\)",replacement = "",a,ignore.case = T) 

但它产生:

[1] "xyz "   "jq"    "abc"   "def (ALTERNO)" "mno (ALTERNO)" "pqr " 

我的理想输出是:

[1] "xyz"  "jqK"  "abc"  "def"  "mno"  "pqr" 

我在做什么错,我该如何纠正? 谢谢,

回答

2

我们可以尝试sub。我们匹配零个或多个空格(\\s*),后跟一个括号(\\(),后跟一个或多个字符(.*),直到字符串结尾($)并替换为''

sub('\\s*\\(.*$', '', a) 
#[1] "xyz" "jqk" "abc" "def" "mno" "pqr" 
+0

感谢@akrun。我太专注于'alterno | a',错过了弦的整个结构......你让我回到了简单。我注意到'gsub'也适用,有没有什么理由我应该使用其中一种? – PavoDive

+0

@PavoDive由于'sub'运行良好,因此不需要'gsub'。 – akrun

2

首先,您需要将POSIX类包装在括号内的表达式中。要完全匹配所有这些子字符串,您需要修改正则表达式来计算所有空格。

[[:blank:]]*\\([[:blank:]]*altern[ao][[:blank:]]*\\)[[:blank:]]* 

IMO,因为[:blank:]比赛空间和标签没有语言环境的变化我会写这个如下,如果你想实际匹配的整个子和前/下空格。

[ \\t]*\\([ \\t]*altern[ao][ \\t]*\\)[ \\t]* 

但是,对于您的给出输入,我只想做:

gsub('[^a-z]+', '', a) 
# [1] "xyz" "jqk" "abc" "def" "mno" "pqr"