2016-08-24 82 views
-3

考虑长度为1以下字符向量:分割字符向量分成两个部分

l <- "http://www.idealo.de/preisvergleich/OffersOfProduct/4983410_-iphone-se-64gb-spacegrau-apple.html" 

我希望将其分割成两个部分,使得第一部分应该是:

p1 <- "http://www.idealo.de/preisvergleich/OffersOfProduct/4983410" 

,第二个:

p2 <- "_-iphone-se-64gb-spacegrau-apple.html" 

当然,人们必须使用正则表达式来解决这个问题。请你能给我一些见解,我可以很容易地学习正则表达式的操作。对于任何帮助,我将衷心感谢。

+1

http://regexone.com在这里你可以学到的基础知识。在http://regex101.com上测试perl = TRUE模式。 –

回答

1

使用"(?<=[^_])(?=_)"strsplit为您提供您所需要的:

strsplit(l, "(?<=[^_])(?=_)", perl = T) 

# [[1]] 
# [1] "http://www.idealo.de/preisvergleich/OffersOfProduct/4983410" 
# [2] "_-iphone-se-64gb-spacegrau-apple.html" 
+0

如果另一个下划线出现在'_' OP之前想要分裂的地方怎么办? –

+0

@WiktorStribiżew这意味着需要指定更多的分割位置约束条件。但数据也可能只包含一个可能事先知道的下划线。我同意OP对这一点不太清楚。 – Psidom

+1

那么,我可以补充一点,在这种情况下,你可以使用'(?= _ [^ _] * $)'前瞻,但原始问题并不清楚。 –

0

如果你有兴趣处理没有正则表达式的情况,你可以使用stringr包中的str_split等函数来分隔这个字符串。

library(stringr) 
l <- "http://www.idealo.de/preisvergleich/OffersOfProduct/4983410_-iphone-se-64gb-spacegrau-apple.html" 
split = stringr::str_split_fixed(l,pattern = "_",2) 
p1 = split[1] 
p2 = split[2] 
+0

这不会产生预期的结果。另外,如果另一个下划线出现在什么地方呢? –