2016-10-11 71 views
0

我有一个字符串strEx <- "list(A, B, C, D)",我想存储为特征向量:的R - 字符串处理和提取

[1] "A" "B" "C" "D" 

我不是在正则表达式非常好(可能是矫枉过正为好,但我会将来需要更多)这可能是我的问题的一部分。我有一个解决方案,我觉得是太多的代码/糟糕的形式。

它给了我最终想要的东西,但我仍然需要将它拆分为逗号并将其弄平。我只是觉得这太简单了。任何人都有更漂亮的解决方案?

d <- gsub(".*\\((.*)\\).*", "\\1", strEx) 
d1 <- unlist(tstrsplit(d, ", ", type.convert = TRUE, fixed = TRUE)) 
+0

所以,在现实情况下,你周围有逗号分隔值的一些文字文本? –

+1

尝试'res < - str_match_all(strEx,“(?:list \\(\\ s * |(?!^)\\ G,?\\ s *)([^,)] +)”)'with '库(stringr)'。不过,你的方法已经很好了。 –

+0

@WiktorStribiżew在实际情况下,它可能是文本(A,B,C,D,...,K)文本。总是只有一个()的块,关闭)可能是字符串中的最后一个字符,或者可能不是。 – ErrantBard

回答

3

你可以解析表达式是这样的:

#parse the expression 
pEx <- parse(text = strEx)[[1]] 

表达式实际上是符号的列表,并可以作这样的处理。在这里,我们把一切都只是list成字符:

vapply(pEx[-1], as.character, FUN.VALUE = "") 
#[1] "A" "B" "C" "D" 

但是,如果你需要解析字符串(这是你提出的使用正则表达式上的解决方案是什么),一些前面的步骤通常应该加以改进。你不应该有一个需要解析的表达式。

看到这个:

library(fortunes) 
fortune(106) 
#If the answer is parse() you should usually rethink the question. 
# -- Thomas Lumley 
#  R-help (February 2005) 
+0

Thx Roland,我会接受这个答案,并提出一个好的观点。这主要是一个试验,以更好地了解字符串操作,但是我昨天晚上改变了这部分,它删除了大部分字符串操作(如果不是全部)。 我有一个1GB的csv,我手动插入的数据,我需要清理。我同意,如果从一开始就做得更好,但这是多年来由数百名不同人员完成的插入的结果,所以我们做了什么:) – ErrantBard

1

您可以eval(parse(...))试试加上引号每一个字母:

unlist(eval(parse(text=gsub("([A-Z])", "\"\\1\"", "list(A, B, C, D)")))) 
#[1] "A" "B" "C" "D" 

如果你还没有逗号第一个字符串中,您可以添加逗号和删除最后一个与另一个sub步:

unlist(eval(parse(text=sub(",(?=[)])", "", gsub("([A-Z])", "\"\\1\",", "list(A B C D)"), perl=TRUE)))) 
# [1] "A" "B" "C" "D" 
+0

thx但不幸的是它似乎不适用于我,当我提供它作为一个字符串像这个z < - “列表(A,B,C,D)”,它需要以编程方式工作。你的答案虽然如此。 – ErrantBard

+0

@ErrantBard对不起,我无意中添加了逗号。当您在字符串中没有逗号时,我使用一个选项进行编辑。希望它对你更好 – Cath

+0

Thx - 现在它的工作:) – ErrantBard

1

您的两步法非常好,可读性强。

> g <- unlist(regmatches(strEx, gregexpr("(?:list\\(\\s*|(?!^)\\G(?:,\\s*)?)\\K[^,)]+", strEx, perl=TRUE))) 
> g 
[1] "A" "B" "C" "D" 

图案的详细资料

如果你想尝试和文字 在一个方框内抓项目转到,可以使用基础R函数使用PCRE正则表达式与 \G\K运营商
  • (?:list\\(\\s*|(?!^)\\G(?:,\\s*)?) - 的list(和0+空格子(见list\\(\\s*一部分)或先前成功匹配的端部(参见(?!^)\\G)和,和ZER可选序列o或更多空白字符(见(?:,\\s*)?
  • \\K - 比,) 1个或多个其他字符 - 省略文本到目前为止
  • [^,)]+匹配。

查看regex demo online

+0

对于那个Wiktor来说是+1,既是为了评估我的尝试,也是为了完成模式细节的替代版本,最后一部分的细节帮助了很多。我会给别人一些时间来尝试一个答案,否则我会高兴地接受你的 – ErrantBard

+0

此外,这是一个只使用基本R函数的解决方案。 –