2012-06-13 9 views
15

Что такое функция strsplit в R, соответствует и удаляет заданное регулярное выражение, чтобы разделить остальную часть строки на векторы.Как расколоть и сохранить элементы с помощью strsplit?

>strsplit("abc123def", "[0-9]+") 
[[1]] 
[1] "abc" "" "" "def" 

Но как я должен разделять строку таким же образом, используя регулярное выражение, но также сохраняя совпадения? Мне нужно что-то вроде следующего.

>FUNCTION("abc123def", "[0-9]+") 
[[1]] 
[1] "abc" "123" "def" 

Использование strapply («abc123def», «[0-9] + | [AZ] +») работает здесь, но что, если остальная часть строки, кроме матчей не могут быть захвачены регулярным выражением ?

+0

Вы можете захватить все символы, используя шаблон «[0-9] + | [^ 0-9] +» или расширить шаблон, чтобы захватить все остальное и отбросить его от выхода с помощью функции FUN = функция (х), если (grepl ("^ [0-9a-z] + $", x)) x –

+0

Привет, я вижу, что вы новичок в SO. Если вы чувствуете, что ответ решил проблему, отметьте ее как «принятую», нажав зеленую галочку. Это помогает сосредоточиться на более старых SO, которые до сих пор не имеют ответов. http://meta.stackexchange.com/questions/88535/asking-for-someone-to-accept-your-answer/135824#135824 –

ответ

22

По существу, мне кажется, что вы хотите не разделить на [0-9]+, а разделить на переход между [0-9]+ и всем остальным. В вашей строке этот переход не существует. Для того, чтобы вставить его, можно предварительно обработать с gsub и задним реферированием:

test <- "abc123def" 
strsplit(gsub("([0-9]+)","~\\1~",test), "~") 

[[1]] 
[1] "abc" "123" "def" 
+0

Никогда не знал об обратной ссылке, связанной с регулярным выражением. Это было то, чего я хотел, и большое спасибо. – jackson

+0

Рад, что решил правильную проблему :-) –

+1

Действительно отличный трюк! – voidHead

2

Вы можете использовать strapply из gsubfn пакета.

test <- "abc123def" 
strapply(X=test, 
     pattern="([^[:digit:]]*)(\\d+)(.+)", 
     FUN=c, 
     simplify=FALSE) 

[[1]] 
[1] "abc" "123" "def" 
5

Вы можете использовать утверждения поиска.

> test <- "abc123def" 
> strsplit(test, "(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)", perl=T) 
[[1]] 
[1] "abc" "123" "def" 
+6

Почему downvote? Он отлично работает для этого ввода. –

+1

+1: Это не только работает, я нахожу это решение более элегантным! Рассмотрим случай, когда вы хотите разделить формулы всякий раз, когда вы сталкиваетесь с плюсом или минусом оператора. Между вами есть имена переменных, которые вы хотели бы изменить. Поэтому вы можете разделить его, оставаться операторами как отдельными строками, редактировать имена переменных и после этого снова объединить весь набор строк. Прекрасно работает с этим решением, не теряя операторов «плюс» и «минус»! – ToJo