2016-10-11 4 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 *) ([^,)] +) ")' с 'библиотека (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

Ваш двухэтапный подход очень хороший и читаемый. Если вы хотите, чтобы попытаться захватить элементы внутри блока текста в один присест, вы можете использовать регулярные выражения PCRE с \G и \K операторов, используя базовые функции R:

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

Узор Детали:

  • (?:list\\(\\s*|(?!^)\\G(?:,\\s*)?) - The list( и 0+ подстрока пробелов (см list\\(\\s* части) или конец предыдущего успешного матча (см (?!^)\\G) и необязательная последовательность , и ZER о или более пробелы (см (?:,\\s*)?)
  • \\K - опускаем текст, совпадающий до сих пор
  • [^,)]+ - 1 или более символов, кроме , и ).

См. regex demo online.

+0

+1 для этого Wiktor, как для оценки моей попытки, так и для альтернативной версии в комплекте с деталями шаблонов, последняя часть с подробностями помогла много. Я дам некоторое время другим, чтобы попытаться ответить, иначе я с радостью соглашусь с вами. – ErrantBard

+0

Кроме того, это решение, использующее только базовые функции R. –

Смежные вопросы