如何计算非结构化数据中第三列之前的字符数(包括空格)?

时间:2017-04-04 22:40:14

标签: r regex text-processing

我有非结构化数据,如下所示:

x <- c("24-March-2017     text1       874874455221112  Text text text10",  
"25-March-2017         text2       54654656TEXT      Text text 11", 
"24-March-2017    text3         874874455221112 Text text text 12") 

我想在第3列之前计算包括空格在内的字符数。例如,在第一行我想在数字874874455221112之前计算。

3 个答案:

答案 0 :(得分:3)

gregexpr是基本R regex函数,它返回有关字符串中多个匹配位置的信息。要提取它们,您需要使用regmatches,但由于gregexpr返回每个匹配的第一个字符的索引,您只需搜索非空格字符组\\S+,选择第三个索引,并减去一个以获得前面的字符数:

sapply(gregexpr('\\S+', x), `[`, 3) - 1
#> [1] 30 34 31

答案 1 :(得分:2)

使用stringr库:

library(stringr)
str_length(str_extract(x,"^(\\S+\\s+){2}"))

答案 2 :(得分:1)

以下是一些在R的基础上都使用regexpr的单行。没有使用包。

1)通常,您可以做出的假设越多,答案就越短。  在这里我们得到一个非常紧凑的答案,假设你在你的意思问题中写文字。话。在这种情况下,第三个字段是第一个字段,它都以数字开头并以空格开头,因此要查找空格字符(“\\s"”)后跟数字("\\d")。

regexpr("\\s\\d", x)

,并提供:

[1] 30 34 31
attr(,"match.length")
[1] 2 2 2
attr(,"useBytes")
[1] TRUE

2)如果单词假设不是这样,那么第二个字段可以以数字开头,那么我们可以通过将第二个字段的第一个字符更改为一个非数字,x说,然后执行上述操作。在下面的代码中,"\\S"匹配任何非空白字符。这给出了与(1)相同的答案,除了它也适用于第二个字段以数字开头的情况。

regexpr("\\s\\d", sub("\\s\\S", " x", x))

3)另一种方法是匹配前两个字段和超出它们的空间。 regexpr将在"match.length"属性中返回所需的字符长度。

attr(regexpr("^(\\S+\\s+){2}", x), "match.length")
## [1] 30 34 31

注意:如果问题是阅读4个字段的部分答案,那么可以通过在字段之间插入逗号或其他特殊字符直接完成,然后使用{{1}读取结果}。我假设第3个字段都是数字,所以TEXT应该在第4个字段中,但是如果它应该在第3个字段中,那么在read.table中用"\\d"替换"\\S"

pat

,并提供:

pat <- "^(\\S+)\\s+(\\S+)\\s+(\\d+)\\s*(.*)"
read.table(text = sub(pat, "\\1,\\2,\\3,\\4", x), sep = ",", colClasses = "character")