在R中提取包含特定类型元素的字符

时间:2018-04-12 16:51:56

标签: r

例如,假设我有以下字符串

vec <- " @_Jim98 Did you turn off the stove @9am?"

我想计算字符串中仅包含数字,字母,@和下划线符号的@字符数。在上面的情况下,自上午9点起它只会算1?包含?符号,所以不计算在内。

此外,它不能超过10个字符。

2 个答案:

答案 0 :(得分:3)

1)搜索@后跟任意数量的允许字符"\\w",后跟空格字符"\\s"|字符串结尾{{1 }}。如果允许零字符,则将+更改为*。表达式是矢量化的,即$可以是字符向量。没有包使用。

x

请注意x <- " @_Jim98 Did you turn off the stove @9am?" # test input pat <- "@\\w+(\\s|$)" lengths(regmatches(x, gregexpr(pat, x))) ## [1] 1 的原因是regmatches为没有匹配产生-1而不是零长度向量,而gregexpr将产生零长度向量。因此,它适用于没有匹配的边缘情况。

2)稍微更紧凑的解决方案是regmatches来自上方:

pat

答案 1 :(得分:2)

我们可以使用正则表达式执行此操作。我正在解释你是在计算由空格字符分隔的单词还是在字符串的开头或结尾处出现的单词。这假设@位于单词的开头,我匹配@后跟一些单词字符\\w(字母和数字)或下划线。您可以删除第一个(^|\\s),如果您不关心在单词的开头@,并且想要计算3个单词,例如" @_Jim98 Did the Latin@s or tom@domain turn off the stove @9am?"

stringr::str_count(" @_Jim98 Did you turn off the stove @9am?", "(^|\\s)@(\\w|_)*?($|\\s)")
#> [1] 1

reprex package(v0.2.0)创建于2018-04-12。