中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
R正則表達(dá)式

http://xukuang.github.io/blog/2016/02/char-in-R/

處理文本是每一種計(jì)算機(jī)語言都應(yīng)該具備的功能,但不是每一種語言都側(cè)重于處理文本。R語言是統(tǒng)計(jì)的語言,處理文本不是它的強(qiáng)項(xiàng)。盡管R語言處理文本的能力不夠強(qiáng),但適當(dāng)使用可以大幅提高工作效率的,而且有些文本操作還不得不用。高效處理文本少不了正則表達(dá)式(regular expression),雖然R在這方面先天不高效,但其中處理文本的絕大多數(shù)函數(shù)都支持正則表達(dá)式。

正則表達(dá)式

正則表達(dá)式是用于描述和匹配一個(gè)文本集合的表達(dá)式。它不是R的專屬內(nèi)容,這里也只簡(jiǎn)單介紹,更詳細(xì)的內(nèi)容請(qǐng)查閱其他文章。

  1. 所有英文字母、數(shù)字和很多可顯示的字符本身就是正則表達(dá)式,用于匹配它們自己。比如 ‘a(chǎn)’ 就是匹配字母 ‘a(chǎn)’ 的正則表達(dá)式

  2. 一些特殊的字符在正則表達(dá)式中被“轉(zhuǎn)義”不在用來描述它自身,這些字符稱為“元字符”。常見元字符的意義如下:

    • \^放在表達(dá)式開始處表示匹配文本開始位置,放在方括號(hào)內(nèi)開始處表示非方括號(hào)內(nèi)的任一字符

    • $ 匹配一個(gè)字符串的結(jié)尾

    • 點(diǎn)號(hào). 表示除了換行符以外的任一字符

    • * 表示將其前的字符進(jìn)行0個(gè)或多個(gè)的匹配

    • .* 可以匹配任意字符

    • + 匹配1或多個(gè)正好在它之前的那個(gè)字符

    • ? 匹配0或1個(gè)正好在它之前的那個(gè)字符

    • 大括號(hào){}表示前面的字符或表達(dá)式的重復(fù)次數(shù)

    • 方括號(hào)[]表示選擇方括號(hào)中的任意一個(gè)(如[a-z] 表示任意一個(gè)小寫字符)

    • | 表示可選項(xiàng),即| 前后的表達(dá)式任選一個(gè)

  3. 如果要在正則表達(dá)式中表示元字符本身,比如我就要在文本中查找問號(hào)‘?’,那么就要使用引用符號(hào)(或稱換碼符號(hào)),一般是反斜杠 ‘'。需要注意的是,在R語言中得用兩個(gè)反斜杠即 ‘\\’,如要匹配括號(hào)就要寫成 ’\\(\\)‘

  4. 不同語言或應(yīng)用程序(事實(shí)上很多規(guī)則都通用)定義了一些特殊的元字符用于表示某類字符,如 :

    • \d 表示數(shù)字0-9,\D 表示非數(shù)字

    • \s 表示空白字符(包括空格、制表符、換行符等),\S 表示非空白字符,

    • \w 表示字(字母和數(shù)字),\W 表示非字

    • \< 和 \> 分別表示以空白字符開始和結(jié)束的文本 需要注意的是,反斜杠 ‘\‘在R語言中得用兩個(gè)反斜杠即 ‘\\’,如’\s’就要寫成 ’\\s‘。

  5. 正則表達(dá)式符號(hào)運(yùn)算順序:圓括號(hào)括起來的表達(dá)式最優(yōu)先,然后是表示重復(fù)次數(shù)的操作(即:* + {} ),接下來是連接運(yùn)算(其實(shí)就是幾個(gè)字符放在一起,如abc),最后是表示可選項(xiàng)的運(yùn)算(|)。所以’foot|bar’ 可以匹配’foot‘或者’bar‘,但是 ‘foot|ba{2}r’匹配的是’foot‘或者’baar‘。

  6. “貪婪”和“懶惰”的匹配規(guī)則。默認(rèn)情況下是匹配盡可能多的字符,是為貪婪匹配,比如 “a.*b”默認(rèn)匹配最長(zhǎng)的a開頭b結(jié)尾的字串,也就是整個(gè)字符串。如果要進(jìn)行懶惰匹配,也就是匹配最短的字串,只需要在后面加個(gè) ?,比如 “a.*?b”,就會(huì)匹配最開始找到的最短的a開頭b結(jié)尾的字串

文本處理

字符數(shù)統(tǒng)計(jì)

函數(shù)nchar,統(tǒng)計(jì)向量中每個(gè)元素的字符個(gè)數(shù),注意這個(gè)函數(shù)和length函數(shù)的差別:length是向量長(zhǎng)度(向量元素的個(gè)數(shù))。

x <- c("Hellow", "World", "!") nchar(x); length(x)    # [1] 6 5 1 # [1] 3length(''); nchar('') # [1] 1 # [1] 0 

字符大小寫轉(zhuǎn)化

  • 函數(shù)tolower,將向量中的元素轉(zhuǎn)化為小寫字母

  • 函數(shù)toupper,將向量中的元素轉(zhuǎn)化為大寫字母

  • 函數(shù)casefold,將向量中的元素轉(zhuǎn)化為小或大寫字母(upper = F,轉(zhuǎn)化為小寫;upper = T,轉(zhuǎn)化為大寫)

  • 函數(shù)chartr,按指定的規(guī)則進(jìn)行轉(zhuǎn)換

tolower(x)    # [1] "hellow" "world"  "!"  toupper(x)    # [1] "HELLOW" "WORLD"  "!" casefold(x) # 默認(rèn)upper = F# [1] "hellow" "world"  "!" casefold(x, upper = T)    # [1] "HELLOW" "WORLD"  "!"  chartr('ol', 'pm', x) # o轉(zhuǎn)化為p,l轉(zhuǎn)化為m# "Hemmpw" "Wprmd"  "!"DNA <- "AtGCtttACC" # DNA為長(zhǎng)度為1的字符向量tolower(DNA)     # [1] "atgctttacc" toupper(DNA)     # [1] "ATGCTTTACC" chartr("Tt", "Uu", DNA) # T轉(zhuǎn)化為U,t轉(zhuǎn)化為u# [1] "AuGCuuuACC" chartr("Tt", "UU", DNA)     # [1] "AUGCUUUACC"

字符串連接

函數(shù)paste應(yīng)該是R中最常用字符串函數(shù)了,也是R字符串處理函數(shù)里面非常純的不使用正則表達(dá)式的函數(shù)(因?yàn)橛貌恢?/p>

paste("CK", 1:6, sep = "")    # [1] "CK1" "CK2" "CK3" "CK4" "CK5" "CK6"x <- list(a = "aaa", b = "bbb", c = "ccc")y <- list(d = 1, e = 2)paste(x, y, sep = "-")  #較短的向量被循環(huán)使用    # [1] "aaa-1" "bbb-2" "ccc-1"

paste函數(shù)還有一個(gè)用法,設(shè)置collapse參數(shù),連成一個(gè)字符串。

paste(x, y, sep = "-", collapse = "; ")    # [1] "aaa-1; bbb-2; ccc-1"paste(x, collapse = "; ")    # [1] "aaa; bbb; ccc"

字符串拆分

strsplit函數(shù)使用正則表達(dá)式,使用格式為:

strsplit(x, split, fixed = FALSE, perl = FALSE, useBytes = FALSE)
  • 參數(shù)x為字串向量,每個(gè)元素都將單獨(dú)進(jìn)行拆分。

  • 參數(shù)split為拆分位置的字串向量,

  • 默認(rèn)為正則表達(dá)式匹配(fixed=FALSE)。如果你沒接觸過正則表達(dá)式,設(shè)置fixed=TRUE,表示使用普通文本匹配或正則表達(dá)式的精確匹配。普通文本的運(yùn)算速度快。

  • 參數(shù)perl=TRUE/FALSE的設(shè)置和perl語言版本有關(guān),如果正則表達(dá)式很長(zhǎng),正確設(shè)置表達(dá)式并且使用perl=TRUE可以提高運(yùn)算速度。

  • 參數(shù)useBytes設(shè)置是否逐個(gè)字節(jié)進(jìn)行匹配,默認(rèn)為FALSE,即按字符而不是字節(jié)進(jìn)行匹配。

text <- "Hello Adam!\nHello Ava!"strsplit(text, " ") # R語言的字符串事實(shí)上也是正則表達(dá)式,文本中的\n在圖形輸出中是被解釋為換行符的。# [[1]]    # [1] "Hello"        "Adam!\nHello" "Ava!"strsplit(text, "\\s")    # [[1]]    # [1] "Hello" "Adam!" "Hello" "Ava!"

strsplit得到的結(jié)果是列表,后面要怎么處理就得看情況而定了。

class(strsplit(text, "\\s"))# [1] "list"

有一種情況很特殊,如果split參數(shù)的字符長(zhǎng)度為0,得到的結(jié)果就是一個(gè)個(gè)的字符。

strsplit(text, "")    # [[1]]    #  [1] "H"  "e"  "l"  "l"  "o"  " "  "A"  "d"  "a"  "m"  "!"  "\n" "H"  "e"     # [15] "l"  "l"  "o"  " "  "A"  "v"  "a"  "!"

從這里也可以看到R把 \n 是當(dāng)成一個(gè)字符來處理的。

字符串查詢和替換

R中字符串的查詢函數(shù)有:grep、grepl、regexpr、gregexpr和regexpr,字符串的替換函數(shù)有sub和gsub。

# 字符串查詢grep(pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE,     fixed = FALSE, useBytes = FALSE, invert = FALSE)grepl(pattern, x, ignore.case = FALSE, perl = FALSE,      fixed = FALSE, useBytes = FALSE)regexpr(pattern, text, ignore.case = FALSE, perl = FALSE,        fixed = FALSE, useBytes = FALSE)gregexpr(pattern, text, ignore.case = FALSE, perl = FALSE,         fixed = FALSE, useBytes = FALSE)regexec(pattern, text, ignore.case = FALSE,        fixed = FALSE, useBytes = FALSE)# 字符串替換sub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,    fixed = FALSE, useBytes = FALSE)## sub函數(shù)會(huì)根據(jù)pattern的規(guī)則對(duì)x中各元素進(jìn)行搜索,遇到符合條件的第一個(gè)子字符串的位置,用replacement替換該子字符串,返回替換后的結(jié)果,和x的結(jié)構(gòu)相同gsub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,     fixed = FALSE, useBytes = FALSE)## gsub函數(shù)會(huì)根據(jù)pattern的規(guī)則對(duì)x中各元素進(jìn)行搜索,找出所有符合條件的子字符串的位置,用replacement替換該子字符串,返回替換后的結(jié)果,和x的結(jié)構(gòu)相同	 

這幾個(gè)函數(shù)有相似的格式,都使用正則表達(dá)式的規(guī)則進(jìn)行匹配。默認(rèn)是egrep的規(guī)則,也可以選用Perl語言的規(guī)則。

  • pattern為字符串表示正則表達(dá)式

  • replacement也是字符串表示替換的內(nèi)容

  • x為字符型向量表示被替換的字符向量

  • 參數(shù)ignore.case = FALSE,表示大小寫敏感

  • 參數(shù)extended = TRUE,表示使用egrep規(guī)則

  • perl = FALSE,表示不使用Perl規(guī)則

  • fixed = FALSE,表示不使用精確匹配

  • useBytes = FALSE,表示按字符匹配

字符串查詢

grep和grepl函數(shù)這兩個(gè)函數(shù)返回向量水平的匹配結(jié)果,不涉及匹配字符串的詳細(xì)位置信息。此外,盡管這兩個(gè)函數(shù)的參數(shù)看起來差不多,但是返回結(jié)果的形式并不一樣。 regexpr、gregexpr和regexpr這三個(gè)函數(shù)返回的結(jié)果包均含了匹配的具體位置和字符串長(zhǎng)度信息,只是他們的結(jié)果顯示方式不同。

text <- c("Hellow, Adam!", "Hi, Paul!", "How are you, Adam.")grep("Adam", text)    # [1] 1 3grepl("Adam", text)    # [1]  TRUE FALSE  TRUEregexpr("Adam", text)    # [1]  9  -1 14    # attr(,"match.length")    # [1] 4 -1 4    # attr(,"useBytes")    # [1] TRUEgregexpr("Adam", text)    # [[1]]    # [1] 9    # attr(,"match.length")    # [1] 4    # attr(,"useBytes")    # [1] TRUE    #     # [[2]]    # [1] -1    # attr(,"match.length")    # [1] -1    # attr(,"useBytes")    # [1] TRUE    #     # [[3]]    # [1] 14    # attr(,"match.length")    # [1] 4    # attr(,"useBytes")    # [1] TRUEregexec("Adam", text)    # [[1]]    # [1] 9    # attr(,"match.length")    # [1] 4    #     # [[2]]    # [1] -1    # attr(,"match.length")    # [1] -1    #     # [[3]]    # [1] 14    # attr(,"match.length")    # [1] 4

字符串替換

盡管sub和gsub是用于字符串替換的函數(shù),但嚴(yán)格地說R語言沒有字符串替換的函數(shù),因?yàn)镽語言不管什么操作對(duì)參數(shù)都是傳值不傳址。

text    # [1] "Hellow, Adam!"      "Hi, Paul!"          "How are you, Adam."sub(pattern = "Adam", replacement = "world", text)    # [1] "Hellow, world!"      "Hi, Paul!"          "How are you, world."text    # [1] "Hellow, Adam!"      "Hi, Paul!"          "How are you, Adam."

可以看到:雖然說是“替換”,但原字符串并沒有改變,要改變?cè)兞课覀冎荒芡ㄟ^再賦值的方式。 sub和gsub的區(qū)別是前者只做一次替換(不管有幾次匹配),而gsub把滿足條件的匹配都做替換。

text1 = c("Hellow, Adam!", "Hi, Paul!", "How are you, Adam, Ava.")sub(pattern = "Adam|Ava", replacement = "world", text1)    # [1] "Hellow, world!"      "Hi, Paul!"          "How are you, world, Ava."gsub(pattern = "Adam|Ava", replacement = "world", text1)    # [1] "Hellow, world!"      "Hi, Paul"          "How are you, world, world."

sub和gsub函數(shù)可以使用提取表達(dá)式(轉(zhuǎn)義字符+數(shù)字)讓部分變成全部:

sub(pattern = ".*(Adam).*", replacement = "Hi, \\1", text)    # [1] "Hi, Adam"  "Hi, Paul!" "Hi, Adam" 

字符串提取

substr和substring函數(shù)通過位置進(jìn)行字符串拆分或提取,它們本身并不使用正則表達(dá)式,但是結(jié)合正則表達(dá)式函數(shù)regexpr、gregexpr或regexec使用可以非常方便地從大量文本中提取所需信息。兩者的參數(shù)設(shè)置基本相同,但它們的返回值的長(zhǎng)度(個(gè)數(shù))有差別:substr返回的字串個(gè)數(shù)等于第一個(gè)參數(shù)的長(zhǎng)度,而substring返回字串個(gè)數(shù)等于三個(gè)參數(shù)中最長(zhǎng)向量長(zhǎng)度,短向量循環(huán)使用。

substr(x, start, stop)substring(text, first, last = 1000000L)
  • x均為要拆分的字串向量

  • start/first 為截取的起始位置向量

  • stop/last 為截取字串的終止位置向量

先看第1參數(shù)(要拆分的字符向量)長(zhǎng)度為1例子。

x <- "123456789"substr(x, c(2, 4), c(4, 5, 8))    # [1] "234"substring(x, c(2, 4), c(4, 5, 8))    # [1] "234"     "45"      "2345678"

因?yàn)閤的向量長(zhǎng)度為1,所以substr獲得的結(jié)果只有1個(gè)字串,即第2和第3個(gè)參數(shù)向量只用了第一個(gè)組合:起始位置2,終止位置4。 而substring的語句三個(gè)參數(shù)中最長(zhǎng)的向量為c(4,5,8),執(zhí)行時(shí)按短向量循環(huán)使用的規(guī)則第一個(gè)參數(shù)事實(shí)上就是c(x,x,x),第二個(gè)參數(shù)就成了c(2,4,2),最終截取的字串起始位置組合為:2-4, 4-5和2-8。

字符串的整理

  • strtrim 函數(shù)

該函數(shù)用于將字符串修剪到特定的顯示寬度,其用法為,

strtrim(x,width)

返回字符串向量的長(zhǎng)度等于x的長(zhǎng)度。因?yàn)槭恰靶藜簟?,所以只能去掉多余的字符不能增加其他額外的字符:如果字符串本身的長(zhǎng)度小于width,得到的是原字符串,別指望它會(huì)用空格或其他什么字符補(bǔ)齊。

strtrim(c("abcdef", "abcdef", "abcdef"), c(1, 5, 10))    # [1] "a"      "abcde"  "abcdef"strtrim(c(1, 123, 1234567), 4)    # [1] "1"    "123"  "1234"
  • strwrap函數(shù)

該函數(shù)把一個(gè)字符串當(dāng)成一個(gè)段落的文字(不管字符串中是否有換行符),按照段落的格式(縮進(jìn)和長(zhǎng)度)和斷字方式進(jìn)行分行,每一行是結(jié)果中的一個(gè)字符串。

str1 <- "Each character string in the input is first split into paragraphs\n(or lines containing whitespace only).  The paragraphs are then\nformatted by breaking lines at word boundaries.  The target\ncolumns for wrapping lines and the indentation of the first and\nall subsequent lines of a paragraph can be controlled\nindependently."str2 <- rep(str1, 2)strwrap(str2, width = 80, indent = 2)    #  [1] "  Each character string in the input is first split into paragraphs (or lines"#  [2] "containing whitespace only).  The paragraphs are then formatted by breaking"      #  [3] "lines at word boundaries.  The target columns for wrapping lines and the"         #  [4] "indentation of the first and all subsequent lines of a paragraph can be"          #  [5] "controlled independently."                                                        #  [6] "  Each character string in the input is first split into paragraphs (or lines"#  [7] "containing whitespace only).  The paragraphs are then formatted by breaking"      #  [8] "lines at word boundaries.  The target columns for wrapping lines and the"         #  [9] "indentation of the first and all subsequent lines of a paragraph can be"          # [10] "controlled independently."

simplify參數(shù)用于指定結(jié)果的返回樣式,默認(rèn)為TRUE,即結(jié)果中所有的字符串都按順序放在一個(gè)字符串向量中(如上);如果為FALSE,那么結(jié)果將是列表。另外一個(gè)參數(shù)exdent用于指定除第一行以外的行縮進(jìn)。

strwrap(str1, width = 80, indent = 0, exdent = 2)    # [1] "Each character string in the input is first split into paragraphs (or lines"      # [2] "  containing whitespace only).  The paragraphs are then formatted by breaking"# [3] "  lines at word boundaries.  The target columns for wrapping lines and the"       # [4] "  indentation of the first and all subsequent lines of a paragraph can be"        # [5] "  controlled independently."
  • match和charmatch函數(shù)

這兩個(gè)函數(shù)用于字符的匹配。

match("xx", c("abc", "xx", "xxx", "xx"))    # [1] 2match(2, c(3, 1, 2, 4))    # [1] 3charmatch("xx", "xx")    # [1] 1charmatch("xx", "xxa")    # [1] 1charmatch("xx", "axx")    # [1] NA

match按向量進(jìn)行運(yùn)算,返回第一次匹配的元素的位置(如果有),非字符向量也可用。正如原作者說的那樣,charmatch函數(shù)真太坑爹了,不建議使用。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
R中的普通文本處理
自學(xué)R語言(十三)-正則表達(dá)式的學(xué)習(xí)
R語言的字符串處理
R語言字符串處理函數(shù)
R語言_符串處理和grep的用法
《R數(shù)據(jù)科學(xué)》第10章-用stringr處理字符串
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服