r - 在R中,我怎样才能找到字符串中n个连续数字的出现
问题描述
我有一个具有相当可重复结构的字符向量,我想将其转换为data.frame
. 目前,我正在标记列之间的分隔,添加\t
. 其中一个字段是一个至少有 5 个字符的数字,所以我想找到它的开始和结束位置,以便在两端添加一个分隔标记。
我的向量类似于这个:
v_char <- c(
"1 Name that may contain 2 number 1234567890 more content later",
"2 Other name that doesn't have a number 1234567870 more content later"
)
我想获得这个向量:
out_v_char <- c(
"1 Name that may contain 2 number \t1234567890\t more content later",
"2 Other name that doesn't have a number \t1234567870\t more content later"
)
我一直无法找到一个正则表达式来标记数字的连续出现,然后找到它们的开始和结束。我已经达到了如下块的位置,但这似乎有点矫枉过正:
digits <- gregexpr("[0-9]", v_char)
f_tmp <- function(v) {
cumsum(c(1L, diff(v) > 1))
}
blocks <- lapply(digits, f_tmp)
f_tmp2 <- function(v, n = 5L) {
tb <- table(v)
first_consecutive <- min(names(tb)[tb > n])
return(c(start = head(which(
v == first_consecutive
), 1L),
end = tail(which(
v == first_consecutive
), 1L)))
}
positions <- lapply(blocks, f_tmp2)
解决方案
我们实际上可以gsub
在这里使用一个简单的
gsub("(\\d{5,})", "\t\\1\t", v_char)
此正则表达式匹配并捕获 5 个或更多 ("{5,}") 数字 ("\d") 的序列。然后gsub
获取捕获的匹配 ("\1") 并在替换字符串中的值之前在其前后添加制表符。
推荐阅读
- xml - 如何在 ImportXML 的 URL 中包含 Google 表格单元格引用
- php - 存储第一页的数据并在第二页使用它而不使用 PHP GET
- python - 从网上下载 ZIP 文件 (Python)
- c# - 从已知宽度和高度的字节数组计算坐标的 X 和 Y
- collections - 如何在特定索引中添加新项目?
- terraform - 使用 Terraform,我如何编排许多相关/依赖堆栈的部署?
- c++ - DFS - 查找源与目标相同的所有路径
- python - 如何在自定义路径中保存/加载 tensorflow 集线器模块?
- scala - Scala - 遍历特定类型
- r - 在 ggplot2 中手动显示图例