2015-03-24 2 views
2

У меня есть текст:Отдельные номера из текста в R

text="blablabla 400ft blablabla" 

Я хотел бы получить:

"blablabla 400 ft blablabla" 

командами:

unlist(strsplit(text,split="[^0-9]+")) 
gsub("[^0-9]+", " ", text, fixed = FALSE) 

возвращают только 400.

Я хотел бы сказать gsub: заменить каждое число, которое вы найти в тексте то же число плюс пробел в начале и в конце. Как я могу это сделать?

+0

По вашему описанию вы ищете 'GSUB («([0-9] +)»,«\\ 1», текст) ', хотя он всегда будет добавлять пространство спереди и сзади, даже если это не нужно. –

+0

Правильно, в случае чисел, которые уже отделены от текста. Я всегда могу снять лишнее пространство позже. – Antoine

ответ

4

Попробуйте

gsub('([0-9]+)([^0-9]+)', '\\1 \\2', text) 
#[1] "blablabla 400 ft blablabla" 

Также работает с несколькими экземплярами

text1 <- paste(text, text) 
gsub('([0-9]+)([^0-9]+)', '\\1 \\2', text1) 
#[1] "blablabla 400 ft blablabla blablabla 400 ft blablabla" 
+0

Это прекрасно работает. – Antoine

+1

Я думаю, вы можете упростить это до просто 'gsub ('(\\ d +) (\\ D +)', '\\ 1 \\ 2', text1)' –

+0

@ user2835597 Я не пробовал 'пробелы в начало ', поскольку оно создаст дополнительное пространство – akrun

2

Я хотел бы сказать GSUB: заменить каждый номер, который вы найдете в тексте тот же номер плюс пробелы в начале и в конце

gsub("([0-9]+)", " \\1 ", text) 
5

Вы также можете использовать внешний вид обходные, если есть некоторые случаи, когда вы хотите, чтобы отделить цифры от «Я», скажем, а не иначе:

text="blablabla 400ft blablabla 400notft" 

gsub('(?<=\\d)(?=ft)', ' ', text, perl = TRUE) 

# [1] "blablabla 400 ft blablabla 400notft" 

в отличие от gsub('([0-9]+)([^0-9]+)', '\\1 \\2', text) который отделит независимо от того, что происходит следующая:

gsub('([0-9]+)([^0-9]+)', '\\1 \\2', text) 

# [1] "blablabla 400 ft blablabla 400 notft" 

и вы также можете использовать другие условия:

text="blablabla 400ft blablabla 400notft blablabla 400in" 

gsub('(?<=\\d)(?=ft|in)', ' ', text, perl = TRUE) 
# [1] "blablabla 400 ft blablabla 400notft blablabla 400 in" 

или сказать вам необходимо добавить пробелы между буквами и цифрами при сохранении правил выше:

text2 <- 'blblabla 400ft blablaba400ft 400 blabla 400notft blah400notft' 
gsub('(?<=[A-Za-z])(?=\\d+)|(?<=\\d)(?=ft|in)', ' ', text2, perl = TRUE) 

# [1] "blblabla 400 ft blablaba 400 ft 400 blabla 400notft blah 400notft" 
+0

Я думаю, у вас есть точка, но я не уверен, что это только для 'ft' – akrun

+0

@akrun Я добавил для ног и дюймов. Я думаю, что все покрывает, да:} – rawr

+0

'[1]« blblabla 400 ft blablaba400 ft 400 blabla »' должно быть пробелы до середины 400? – rawr

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