我正在使用R,并在下面有以下字符串:
s <- "\t\t\t \t\t\thello world ! \t\t\thello"
我想仅在字符串的开头获取空格的匹配计数,而不是其他任何地方。因此,应忽略内容之间的空格,并且只应计算起点。结果将是“9”。
我尝试过以下操作,但它只返回“1”...
的计数sapply(regmatches(s, gregexpr('^(\\s)', s)), length)
我不擅长正则表达式,感谢任何帮助。
答案 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
匹配所有剩余的水平空格(即开头的空格)。