类似于此处上传的问题: Split string and numbers 我有一个包含数字和单词的字符串,其模式为:
20.40title1. description1. 21.00title2. description2 ...
我希望拥有的最终产品具有以下形式
Hour title description
20.40 title1 description1
21.00 title2 description2
... ... ...
因此,我可能需要在每次出现数字之前先拆分字符串,然后再用“。”的第一个外观再次拆分字符串。 我的第一步遇到了麻烦。
谢谢, 大卫
答案 0 :(得分:4)
由于分隔符的宽度为零,因此将其视为提取或匹配任务而不是拆分任务似乎更容易。对于这种方法,您首先要编写正则表达式以匹配要提取的每个片段。 stringr::str_match
函数是一种方便的方法。
x <- "20.40title1. description1. 21.00title2. description2"
out <- do.call(
cbind,
str_match_all(
x,
c("\\d+\\.\\d+",
"title\\d+",
"description\\d+")))
如果需要,您可以清理并命名结果;
out <- setNames(type.convert(as.data.frame(out)),
c("Hour", "title", "description"))
out
## Hour title description
## 1 20.4 title1 description1
## 2 21.0 title2 description2
答案 1 :(得分:1)
使用i
tidyverse
数据
library(tidyverse)
df %>% mutate(A=gsub('(description\\d)','\\1-',A)) %>%
separate_rows(A,sep='-') %>%
mutate(Hour=str_extract(A,'\\d{2}.\\d{2}'),Title=str_extract(A,'title\\d+'), Description=str_extract(A,'description\\d+')) %>%
filter(!is.na(Hour))
A Hour Title Description
1 20.40title1. description1 20.40 title1 description1
2 . 21.00title2. description2 21.00 title2 description2
答案 2 :(得分:1)
另一种选择是使用strapply
中的gsubfn
ss <- "20.40title1. description1. 21.00title2. description2"
library(gsubfn)
strapply(
strsplit(ss, "\\s(?=\\d)", perl = T), "(\\d+\\.?\\d*)(\\w+)\\.*\\s+(\\w+)\\.*",
c, combine = list, simplify = x ~ do.call(rbind, x))
# [,1] [,2] [,3]
#[1,] "20.40" "title1" "description1"
#[2,] "21.00" "title2" "description2"