R开始匹配计数

时间:2015-01-13 05:47:16

标签: regex r

我正在使用R,并在下面有以下字符串:

s <- "\t\t\t   \t\t\thello    world   !  \t\t\thello"

我想仅在字符串的开头获取空格的匹配计数,而不是其他任何地方。因此,应忽略内容之间的空格,并且只应计算起点。结果将是“9”。

我尝试过以下操作,但它只返回“1”...

的计数
sapply(regmatches(s, gregexpr('^(\\s)', s)), length)

我不擅长正则表达式,感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

为了匹配第一次出现,regexpr()gregexpr()更合适。由于该切换,sapply()将不再需要,因为regexpr()返回原子向量,而gregexpr()返回列表。

您可以使用以下正则表达式,查看regexpr()结果中的 match.length 属性。

attr(regexpr("^\\s+", s), "match.length")
# [1] 9

正则表达式的说明:

  • ^强制正则表达式位于字符串的开头。
  • \\s空格字符:制表符,换行符,垂直制表符,换页符,回车符和空格。
  • +上一项将匹配一次或多次。

参考:http://en.wikibooks.org/wiki/R_Programming/Text_Processing

答案 1 :(得分:2)

另一种解决方法是使用\G进行锚定。 \G功能是一个可以在两个位置之一匹配的锚点;字符串的开头,或消耗最后一个匹配的最后一个字符的点。

sapply(gregexpr("\\G\\s", s, perl = TRUE), length)
# [1] 9

答案 2 :(得分:0)

你也可以尝试一下。

> sapply(gregexpr("[^\\h].*(*SKIP)(*F)|\\h", s, perl = TRUE), length)
[1] 9
> sapply(gregexpr("\\S.*(*SKIP)(*F)|\\h", s, perl = TRUE), length)
[1] 9

\\h匹配水平空格。 \S匹配非空格字符,并且以下.*匹配该非空格字符后面的所有字符,直到行结束。 (*SKIP)(*F)使匹配失败。 |旁边的部分\h匹配所有剩余的水平空格(即开头的空格)。