我在strsplit()
中发现了一种非常奇怪的行为。它与this question类似,但我很想知道为什么它首先返回一个空元素。有人知道吗?
unlist(strsplit("88F5T7F4T13F", "\\d+"))
[1] "" "F" "T" "F" "T" "F"
因为我使用那个字符串来复制一个长逻辑向量(88 * FALSE 5 * TRUE 7 * FALSE 4 * TRUE 13 * FALSE)我必须信任它......
回答unlist(strsplit("88F5T7F4T13F", "\\d+"))[-1]
有效,但它是否健全?
答案 0 :(得分:1)
出现空元素,因为开头有数字。由于您在数字处拆分,因此第一次拆分发生在字符串的开头和第一个F
之间,并且字符串start处的空字符串将添加到结果列表中。
您可以使用自己的解决方案,因为它已经运行良好。如果您对替代解决方案感兴趣,请参阅以下内容:
unlist(strsplit(sub("^\\d+", "", "88F5T7F4T13F"), "\\d+"))
由于带有sub
模式的^\d+
删除了所有前导数字(^
是字符串的开头而\d+
匹配1,因此它会在结果拆分消失器中生成空元素或更多数字)。但是,它不健壮,因为它使用2个正则表达式。
library(stringr)
res = str_extract_all(s, "\\D+")
这只需要一个匹配正则表达式,\D+
- 一个或多个非数字符号和一个外部库。
如果您想对基数R做类似的事情,请将regmatches
与gregexpr
一起使用:
regmatches(s, gregexpr("\\D+", s))