当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R strsplit 分割字符向量的元素


R语言 strsplit 位于 base 包(package)。

说明

根据其中子字符串 split 的匹配,将字符向量 x 的元素拆分为子字符串。

用法

strsplit(x, split, fixed = FALSE, perl = FALSE, useBytes = FALSE)

参数

x

字符向量,其中的每个元素都要被分割。其他输入(包括因子)将给出错误。

split

包含用于分割的 regular expression (除非 fixed = TRUE )的字符向量(或可以强制为此类的对象)。如果出现空匹配,特别是如果 split 的长度为 0,则 x 将被拆分为单个字符。如果split的长度大于1,则沿着x重新循环。

fixed

合乎逻辑的。如果TRUEsplit 完全匹配,否则使用正则表达式。优先于 perl

perl

合乎逻辑的。应该使用 Perl 兼容的正则表达式吗?

useBytes

合乎逻辑的。如果TRUE 匹配是逐字节而不是逐字符完成的,并且具有标记编码的输入不会被转换。如果发现任何标记为 "bytes" 的输入(请参阅 Encoding ),则会强制执行此操作(带有警告)。

细节

参数 split 将被强制转换为字符,因此您将看到与 split = NULL 一起使用来表示 split = character(0) ,包括在下面的示例中。

请注意,可以通过 split = character(0)split = "" 来拆分为单个字符;两者是等价的。这里 ‘character’ 的定义取决于语言环境:在单字节语言环境中,它是一个字节,在多字节语言环境中,它是由“宽字符”表示的单位(几乎总是 Unicode 代码点)。

split 的缺失值根本不会拆分 x 的相应元素。

应用于每个输入字符串的算法是

    repeat {
        if the string is empty
            break.
        if there is a match
            add the string to the left of the match to the output.
            remove the match and all to the left of it.
        else
            add the string to the output.
            break.
    }

请注意,这意味着如果在(非空)字符串的开头存在匹配项,则输出的第一个元素是 "" ,但如果在字符串的末尾存在匹配项,则输出是与删除匹配项相同。

另请注意,如果非空字符串开头存在空匹配,则返回第一个字符,并且算法继续处理字符串的其余部分。在设计正则表达式时需要牢记这一点。例如,当查找后跟字母的单词边界( "[[:<:]]"perl = TRUE )时,可以禁止在字符串开头进行匹配(通过 "(?!^)[[:<:]]" )。

当前语言环境中的无效输入将被警告最多 5 次。

x 长度相同的列表,其中第 i 元素包含 x[i] 的分割向量。

如果 xsplit 的任何元素被声明为 UTF-8 格式(请参阅 Encoding ),则结果中的所有非 ASCII 字符串都将采用 UTF-8 格式,并将其编码声明为 UTF-8 。 (如果任何元素被声明为 Latin-1,除了在 Latin-1 语言环境中之外,这也成立。)对于 perl = TRUE, useBytes = FALSE,多字节语言环境中的所有非 ASCII 字符串都将转换为 UTF-8。

如果 xsplit 的任何元素被标记为 "bytes" (参见 Encoding ),则结果中拆分创建的所有非 ASCII 字符串将被标记为 "bytes" ,但结果的编码未分割的字符串未指定(可能是"bytes"或原始字符串)。如果 xsplit 中没有元素被标记为 "bytes" ,而是标记为 useBytes = TRUE ,则即使通过拆分创建的结果字符串的编码也是未指定的(可能是 "bytes""unknown" ,可能在当前编码)。不鼓励混合使用 "bytes" 和其他标记编码,但如果仍然需要,可以使用 iconv 重新编码结果,例如转换为 UTF-8,并适当替换无效字节。

例子

noquote(strsplit("A text I want to display with spaces", NULL)[[1]])

x <- c(as = "asfef", qu = "qwerty", "yuiop[", "b", "stuff.blah.yech")
# split x on the letter e
strsplit(x, "e")

unlist(strsplit("a.b.c", "."))
## [1] "" "" "" "" ""
## Note that 'split' is a regexp!
## If you really want to split on '.', use
unlist(strsplit("a.b.c", "[.]"))
## [1] "a" "b" "c"
## or
unlist(strsplit("a.b.c", ".", fixed = TRUE))

## a useful function: rev() for strings
strReverse <- function(x)
        sapply(lapply(strsplit(x, NULL), rev), paste, collapse = "")
strReverse(c("abc", "Statistics"))

## get the first names of the members of R-core
a <- readLines(file.path(R.home("doc"),"AUTHORS"))[-(1:8)]
a <- a[(0:2)-length(a)]
(a <- sub(" .*","", a))
# and reverse them
strReverse(a)

## Note that final empty strings are not produced:
strsplit(paste(c("", "a", ""), collapse="#"), split="#")[[1]]
# [1] ""  "a"
## and also an empty string is only produced before a definite match:
strsplit("", " ")[[1]]    # character(0)
strsplit(" ", " ")[[1]]   # [1] ""

也可以看看

paste 用于相反,grepsub 用于字符串搜索和操作;还有ncharsubstr

regular expression’了解模式规范的详细信息。

选项 PCRE_use_JIT 控制 perl = TRUE 时的详细信息。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Split the Elements of a Character Vector。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。