當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。