2016-01-21 2 views
2

Я хочу разбить строку символов на две группы. Структура строки довольно проста, но я не смог заставить ее работать.regex в R "ест" часть строки

txt <- "text12-01-2016" 

Это всегда буквы, за которыми следует дата, а дата, очевидно, начинается с числа. Я попробовал следующее регулярное выражение в https://regex101.com/ и эффективно получить строку правильно отделенный:

([a-zA-Z]*)([0-9].*) 
1. "text" 
2. "12-01-2016" 

Но когда я пытаюсь в R он терпит неудачу:

strsplit(a[1],split = "([a-zA-Z]*)([0-9]*)") 
[[1]] 
[1] "" " " "" "." " " "" " " "" "-" "" "-" "" 

А если ввести двойные квадратные скобки, то «съедает» из последнего символа из первой группы, а первый из второго:

strsplit(txt,split = "([[a-zA-Z]]*)([[0-9]]*)") 
[[1]] 
[1] "tex"  "2-01-2016" 

Это не имеет значения, если я использую perl=TRUE. Результат согласуется также, если я использую stringi::stri_split, поэтому это проблема в моем регулярном выражении.

Какое правильное выражение используется в этом случае?

ответ

5

«Проблема» в том, что у вас есть регулярное выражение для сопоставления , а не для расщепления.

Вы можете использовать following PCRE regex с strsplit:

strsplit(txt,split = "(?<=[a-zA-Z])(?=[0-9])", perl=T) 
[[1]] 
[1] "text"  "12-01-2016" 

Регулярное выражение будет соответствовать расположение между буквой и цифрой и strsplit разделит результат. Вы можете перечислить его дальше, если вам нужно.

Если вы хотите использовать регулярное выражение, используйте str_match из stringr:

> library(stringr) 
>str_match(txt, "([a-zA-Z]*)([0-9].*)") 
    [,1]    [,2] [,3]   
[1,] "text12-01-2016" "text" "12-01-2016" 
Смежные вопросы