R起始匹配计数

6

我正在使用R语言,以下是我的字符串:

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

我想获取字符串开头空格的匹配数,不包括其他位置的空格。因此,应该忽略内容之间的空格,仅计算开头的空格数量。在这里结果将是 "9"。
我尝试了以下代码,但只返回了一个计数器为"1"的结果...
sapply(regmatches(s, gregexpr('^(\\s)', s)), length)

我不太擅长正则表达式,需要帮助。

3个回答

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
attr(regexpr("^\\s+",s),"match.length") 也可以运行。 - thelatemail
@thelatemail - 有趣。所以制表符 \\t 被识别为普通空格?我不知道这一点。 - Rich Scriven
1
好的,我已经编辑过了。在空格的背景下这更有意义。 - Rich Scriven
@RichardScriven 我建议你将 "^\\s+" 改为 "^\\h+",因为 ^\\s+ 会计算在开头出现的换行符。我认为 op 的意思是只有水平空格而不是垂直空格。 - Avinash Raj
所有可见的空格都是水平空格,即空格或制表符。垂直空格包括\n\r\f - Avinash Raj
显示剩余4条评论

2

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

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

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 匹配所有剩余的横向空格(即在开头存在的空格)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接