2015-07-10 69 views
12

我有一个字符串。如何使用正则表达式删除R中特定开始和结束的字符串段?

str = c("F14 : M114L","W15 : M116L, W15 : M118L","W15 : D111L, F14 : E112L, F14 : M116L") 

的目标是删除之间的任何东西:和L(也包括就在前面:)白色空间,使得我最终不得不

"F14", "W15, W15", "W15, F14, F14" 

我使用思维

gsub(" : [[:alnum:]]L", "", str) 

但显然它不起作用。不知道是否有什么类似于一个通配符,可以代表任何数量之间的数字和字符:和L.

+2

我认为一个'+'将做到这一点:'GSUB( “:[[:alnum:]] + L”, “”,STR)' – Frank

+0

有用。有一段时间没有使用正则表达式。我忘记了[[:alnum:]]只占一个字母或数字。 – wen

回答

7

这将做到这一点:

gsub(" : .*?L", "", str) 
#[1] "F14"   "W15, W15"  "W15, F14, F14" 
+0

'?'是否告诉'。*'当它碰到'L'时停止,使它变得不真实?在 – Frank

+1

@Frank之前,我只看到过'''作为量词。量词之后的'?'使它不贪婪。它变成了一个“懒惰”的量词。 – Jota

+7

我看到双。 –

6

夫妇的做法。

取前几个字母,如果它总是三:

substr(str,1,3) 

我个人非常喜欢stringr了。它使提取真的很简单。模式你想要的,而不是你不想要的。

library(stringr) 
str_extract(str,"[A-Z][0-9]*") 

我已经简化这些为载体,但你有子元素,你需要这样的:

splits <- strsplit(str,", ") 
result <- lapply(splits, substr, start = 1, stop = 3) 

result <- lapply(splits, str_extract, pattern = "[A-Z][0-9]*") 
+0

啊,是的,为substr解决方案。接得好。 –

7

你可以做到这一点很容易使用qdapRegex我维护的包:

str = c("F14 : M114L","W15 : M116L, W15 : M118L","W15 : D111L, F14 : E112L, F14 : M116L") 

library(qdapRegex) 
rm_between(str, "\\s:", "L") 
## [1] "F14"   "W15, W15"  "W15, F14, F14" 

qdapRegex旨在使其有用,因为它教。如果您有兴趣使用正则表达式...

S("@rm_between", "\\s:", "L") 
## [1] "(\\s:)(.*?)(L)" 

gsub(S("@rm_between", "\\s:", "L") , "", str) 
相关问题