R正則表達(dá)式(grep,grepl,regexpr,sub,gsub)

一、Firstly? Dimension

正則表達(dá)式簡(jiǎn)介:

傳統(tǒng)的統(tǒng)計(jì)學(xué)教育幾乎沒(méi)有告訴過(guò)我們蹦渣,如何進(jìn)行文本的統(tǒng)計(jì)建模分析怠缸。然而,我們?nèi)粘I钪薪佑|到的大部分?jǐn)?shù)據(jù)都是以文本的形式存在嗅义。文本分析與挖掘在業(yè)界中也有著非常廣泛的應(yīng)用屏歹。

由于文本數(shù)據(jù)大多屬于非結(jié)構(gòu)化的數(shù)據(jù),要想對(duì)文本數(shù)據(jù)進(jìn)行傳統(tǒng)的統(tǒng)計(jì)模型分析之碗,必須要經(jīng)過(guò)層層的數(shù)據(jù)清洗與整理蝙眶。

今天我們要介紹的『正則表達(dá)式及R字符串處理』就是用來(lái)干這一種臟活累活的。

與建立酷炫的模型比起來(lái)继控,數(shù)據(jù)的清洗與整理似乎是一種低檔次的工作械馆。如果把建立模型類比于高級(jí)廚師的工作,那么武通,數(shù)據(jù)清洗無(wú)疑是類似切菜洗碗打掃衛(wèi)生的活兒霹崎。然而想要成為資深的『數(shù)據(jù)玩家』,這種看似低檔次的工作是必不可少的冶忱,并且尾菇,這種工作極有可能將占據(jù)你整個(gè)建模流程的80%的時(shí)間。

如果我們能夠掌握高效的數(shù)據(jù)清洗工具囚枪,那么我們將擁有更多的時(shí)間來(lái)進(jìn)行模型選擇和參數(shù)調(diào)整派诬,使得我們的模型更加合理有效。

我會(huì)從介紹兩種不同的正則表達(dá)式链沼,但是他們解決的問(wèn)題其實(shí)是一樣的默赂。

下面將要將要舉例說(shuō)明,一一介紹R中常用來(lái)處理此類工作的幾個(gè)函數(shù)括勺。

一缆八、首先學(xué)習(xí)grep函數(shù)曲掰,是R語(yǔ)言中最基本的正則表達(dá)式函數(shù)

賦值:

txt<-c("one more","Hello world","up up day","one the more","one two three")

num<-c("one","foru")


num在txt的位置


顯示出值


顯示沒(méi)有匹配上的值


返回布爾值


regexpr函數(shù)

# 第一行:返回布爾值(1-匹配上,0-沒(méi)匹配上)

# 第二行:返回匹配的長(zhǎng)度,負(fù)值為沒(méi)有匹配上

# 第三行:類型

# 第四行:是否有匹配上的結(jié)果(顯示是否逐個(gè)字節(jié)進(jìn)行匹配,默認(rèn)為FALSE奈辰,即按字符而不是字節(jié)進(jìn)行匹配)

attr(a,"index.type")# 類型

attr(a,"match.length") #返回匹配的長(zhǎng)度,負(fù)值為沒(méi)有匹配上

attr(a,"useBytes") #查看是否有匹配上的結(jié)果

gregexpr函數(shù)

regexpr()函數(shù)只查詢匹配第一個(gè)特定字符栏妖,要想多次匹配需要使用gregexpr()函數(shù)


Sub函數(shù), 返回替換字符串后的具體內(nèi)容

sub(ignore.case,extended,perl,fixed,useBytes,pattern,replacement,x)

參數(shù):

# ignore.case = FALSE奖恰,表示大小寫敏感

# extended = TRUE吊趾,表示使用egrep規(guī)則

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

# fixed = FALSE瑟啃,表示不使用精確匹配

# useBytes = FALSE论泛,表示按字符匹配

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

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

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

# 該函數(shù)會(huì)根據(jù)pattern的規(guī)則對(duì)x中各元素進(jìn)行搜索,遇到符合條件的第一個(gè)子字符串的位置(gsub是替換所有符合條件的)翰守,用replacement替換該子字符串孵奶,返回替換后的結(jié)果,和x的結(jié)構(gòu)相同


Sub函數(shù)

# 我們對(duì)replacement統(tǒng)一賦值為“”,在c("abcd","dcba")里面查找"a",替換為空

# 該例中的"a"只是一個(gè)字符蜡峰,并不是正則表達(dá)式了袁,真正的正則表達(dá)式依靠元字符進(jìn)行靈活的匹配。


字符開始

# 表示將開頭為a的字符串中的a替換成空湿颅,在返回值中可以發(fā)現(xiàn)后面出現(xiàn)的a并沒(méi)有被替換载绿。如果要將開頭的一個(gè)字符串替換,簡(jiǎn)單地寫成“^ab”就行.


字符結(jié)尾

# 表示將以a結(jié)尾的字符串中的a替換成空油航。


除此以外


任意字符
邏輯或
補(bǔ)集

?由于sub只替換搜尋到的第一個(gè)崭庸,因此這個(gè)例子中用gsub效果更好.


a/b
范圍
范圍(數(shù)字)

以上是最基礎(chǔ)的正則表達(dá)式元字符,在一些正則表達(dá)式的書籍和資料中有非常詳細(xì)的介紹谊囚。最后需要提一下的是“貪婪”和“懶惰”的匹配規(guī)則怕享。默認(rèn)情況下是匹配盡可能多的字符,是為貪婪匹配镰踏,默認(rèn)匹配最長(zhǎng)的a開頭b結(jié)尾的字串函筋,也就是整個(gè)字符串。

貪婪匹配

如果要進(jìn)行懶惰匹配奠伪,也就是匹配最短的字串跌帐,只需要在后面加個(gè)“?”#就會(huì)匹配最開始找到的最短的a開頭b結(jié)尾的字串。

懶惰匹配



二绊率、Secondly?? Dimension

正則表達(dá)式不是R的專屬內(nèi)容谨敛,這里只做簡(jiǎn)單介紹,更詳細(xì)的內(nèi)容請(qǐng)查閱其他文章滤否。

正則表達(dá)式是用于描述/匹配一個(gè)文本集合的表達(dá)式:

所有英文字母脸狸、數(shù)字和很多可顯示的字符本身就是正則表達(dá)式,用于匹配它們自己藐俺。比如 “a” 就是匹配字母 “a” 的正則表達(dá)式

一些特殊的字符在正則表達(dá)式中不在用來(lái)描述它自身肥惭,它們?cè)谡齽t表達(dá)式中已經(jīng)被“轉(zhuǎn)義”盯仪,這些字符稱為“元字符”紊搪。perl類型的正則表達(dá)式中被轉(zhuǎn)義的字符有:. \ | ( ) [ ] { } ^ $ * + ?蜜葱。被轉(zhuǎn)義的字符已經(jīng)有特殊的意義,如點(diǎn)號(hào) . 表示任意字符耀石;方括號(hào)表示選擇方括號(hào)中的任意一個(gè)(如[a-z] 表示任意一個(gè)小寫字符)牵囤;^ 放在表達(dá)式開始出表示匹配文本開始位置,放在方括號(hào)內(nèi)開始處表示非方括號(hào)內(nèi)的任一字符滞伟;大括號(hào)表示前面的字符或表達(dá)式的重復(fù)次數(shù)揭鳞;| 表示可選項(xiàng),即 | 前后的表達(dá)式任選一個(gè)梆奈。

如果要在正則表達(dá)式中表示元字符本身野崇,比如我就要在文本中查找問(wèn)號(hào)“?”, 那么就要使用引用符號(hào)(或稱換碼符號(hào))亩钟,一般是反斜杠 “\”乓梨。需要注意的是,在R語(yǔ)言中得用兩個(gè)反斜杠即 “\”清酥,如要匹配括號(hào)就要寫成 “”

不同語(yǔ)言或應(yīng)用程序(事實(shí)上很多規(guī)則都通用)定義了一些特殊的元字符用于表示某類字符扶镀,如 \d 表示數(shù)字0-9, \D 表示非數(shù)字焰轻,\s 表示空白字符(包括空格臭觉、制表符、換行符等)辱志,\S 表示非空白字符蝠筑,\w 表示字(字母和數(shù)字),\W 表示非字揩懒,< 和 > 分別表示以空白字符開始和結(jié)束的文本什乙。

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

2 字符數(shù)統(tǒng)計(jì)和字符翻譯

2.1 nchar和length

nchar這個(gè)函數(shù)簡(jiǎn)單鸽素,統(tǒng)計(jì)向量中每個(gè)元素的字符個(gè)數(shù)褒繁,注意這個(gè)函數(shù)和length函數(shù)的差別:nchar是向量元素的字符個(gè)數(shù),而length是向量長(zhǎng)度(向量元素的個(gè)數(shù))馍忽。其他沒(méi)什么需要說(shuō)的棒坏。

2.2 tolower燕差,toupper和chartr

這三個(gè)函數(shù)用法也很簡(jiǎn)單: tolower 大寫轉(zhuǎn)小寫 toupper 小寫轉(zhuǎn)大寫 chartr

chartr(“Tt”, “Uu”, DNA)

[1] “AuGCuuuACC”

chartr(“Tt”, “UU”, DNA)

[1] “AUGCUUUACC”

3 字符串連接

3.1 paste函數(shù)

paste應(yīng)該是R中最常用字符串函數(shù)了,也是R字符串處理函數(shù)里面非常純的不使用正則表達(dá)式的函數(shù)(因?yàn)橛貌恢┌用帷K喈?dāng)于其他語(yǔ)言的strjoin徒探,但是功能更強(qiáng)大。它把向量連成字串向量喂窟,其他類型的數(shù)據(jù)會(huì)轉(zhuǎn)成向量测暗,但不一定是你要的結(jié)果:

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”

z <- list(x, y)

paste(“T”, z, sep = “:”)

[1] “T:list(a = “aaa”, b = “bbb”, c = “ccc”)”

[2] “T:list(d = 1, e = 2)”

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”

4 字符串拆分

4.1 strsplit函數(shù)

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)。如果你沒(méi)接觸過(guò)正則表達(dá)式厦酬,設(shè)置fixed=TRUE胆描,表示使用普通文本匹配或正則表達(dá)式的精確匹配。普通文本的運(yùn)算速度快弃锐。

perl=TRUE/FALSE的設(shè)置和perl語(yǔ)言版本有關(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, " ")

[[1]]

[1] “Hello” “Adam!\nHello” “Ava!”

R語(yǔ)言的字符串事實(shí)上也是正則表達(dá)式鸠按,上面文本中的\n在圖形輸出中是被解釋為換行符的

strsplit(text, “\s”)

[[1]]

[1] “Hello” “Adam!” “Hello” “Ava!”

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

class(strsplit(text, “\s”))

[1] “l(fā)ist”

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

strsplit(text, “”)

[[1]]

[1] “H” “e” “l(fā)” “l(fā)” “o” " " “A” “d” “a” “m” “!” “\n” “H” “e”

[15] “l(fā)” “l(fā)” “o” " " “A” “v” “a” “!”

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

5 字符串查詢:

5.1 grep和grepl函數(shù):

這兩個(gè)函數(shù)返回向量水平的匹配結(jié)果,不涉及匹配字符串的詳細(xì)位置信息扎运。

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)

雖然參數(shù)看起差不多瑟曲,但是返回的結(jié)果不一樣。下來(lái)例子列出C:\windows目錄下的所有文件豪治,然后用grep和grepl查找exe文件:

files <- list.files(“c:/windows”)

grep("\.exe$", files)

[1] 8 28 30 35 36 58 69 99 100 102 111 112 115 117

grepl("\.exe$", files)

[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE

[12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

[23] FALSE FALSE FALSE FALSE FALSE TRUE FALSE TRUE FALSE FALSE FALSE

[34] FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

[45] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

[56] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

[67] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

[78] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

[89] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE

[100] TRUE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

[111] TRUE TRUE FALSE FALSE TRUE FALSE TRUE FALSE

grep僅返回匹配項(xiàng)的下標(biāo)洞拨,而grepl返回所有的查詢結(jié)果,并用邏輯向量表示有沒(méi)有找到匹配负拟。兩者的結(jié)果用于提取數(shù)據(jù)子集的結(jié)果都一樣:

files[grep("\.exe$", files)]

[1] “bfsvc.exe” “explorer.exe” “fveupdate.exe” “HelpPane.exe”

[5] “hh.exe” “notepad.exe” “regedit.exe” “twunk_16.exe”

[9] “twunk_32.exe” “uninst.exe” “winhelp.exe” “winhlp32.exe”

[13] “write.exe” “xinstaller.exe”

files[grepl("\.exe$", files)]

[1] “bfsvc.exe” “explorer.exe” “fveupdate.exe” “HelpPane.exe”

[5] “hh.exe” “notepad.exe” “regedit.exe” “twunk_16.exe”

[9] “twunk_32.exe” “uninst.exe” “winhelp.exe” “winhlp32.exe”

[13] “write.exe” “xinstaller.exe”

5.2 regexpr烦衣、gregexpr和regexec

這三個(gè)函數(shù)返回的結(jié)果包含了匹配的具體位置和字符串長(zhǎng)度信息,可以用于字符串的提取操作。

text <- c(“Hellow, Adam!”, “Hi, Adam!”, “How are you, Adam.”)

regexpr(“Adam”, text)

[1] 9 5 14

attr(,“match.length”)

[1] 4 4 4

attr(,“useBytes”)

[1] TRUE

gregexpr(“Adam”, text)

[[1]]

[1] 9

attr(,“match.length”)

[1] 4

attr(,“useBytes”)

[1] TRUE

[[2]]

[1] 5

attr(,“match.length”)

[1] 4

attr(,“useBytes”)

[1] TRUE

[[3]]

[1] 14

attr(,“match.length”)

[1] 4

attr(,“useBytes”)

[1] TRUE

regexec(“Adam”, text)

[[1]]

[1] 9

attr(,“match.length”)

[1] 4

[[2]]

[1] 5

attr(,“match.length”)

[1] 4

[[3]]

[1] 14

attr(,“match.length”)

[1] 4

6 字符串替換

6.1 sub和gsub函數(shù)

雖然sub和gsub是用于字符串替換的函數(shù)花吟,但嚴(yán)格地說(shuō)R語(yǔ)言沒(méi)有字符串替換的函數(shù)秸歧,因?yàn)镽語(yǔ)言不管什么操作對(duì)參數(shù)都是傳值不傳址

text

[1] “Hellow, Adam!” “Hi, Adam!” “How are you, Adam.”

sub(pattern = “Adam”, replacement = “world”, text)

[1] “Hellow, world!” “Hi, world!” “How are you, world.”

text

[1] “Hellow, Adam!” “Hi, Adam!” “How are you, Adam.”

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

sub(pattern = “Adam|Ava”, replacement = “world”, text)

[1] “Hellow, world!” “Hi, world!” “How are you, world.”

gsub(pattern = “Adam|Ava”, replacement = “world”, text)

[1] “Hellow, world!” “Hi, world!” “How are you, world.”

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

sub(pattern = “.(Adam).”, replacement = “\1”, text)

[1] “Adam” “Adam” “Adam”

7 字符串提取

7.1 substr和substring函數(shù)

substr和substring函數(shù)通過(guò)位置進(jìn)行字符串拆分或提取矾麻,它們本身并不使用正則表達(dá)式纱耻,但是結(jié)合正則表達(dá)式函數(shù)regexpr、gregexpr或regexec使用可以非常方便地從大量文本中提取所需信息险耀。兩者的參數(shù)設(shè)置基本相同:

substr(x, start, stop)

substring(text, first, last = 1000000L)

x均為要拆分的字串向量

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

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

但它們的返回值的長(zhǎng)度(個(gè)數(shù))有差 別:

substr返回的字串個(gè)數(shù)等于第一個(gè)參數(shù)的長(zhǎng)度

而substring返回字串個(gè)數(shù)等于三個(gè)參數(shù)中最長(zhǎng)向量長(zhǎng)度,短向量循環(huán)使用玖喘。

先看第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的語(yǔ)句三個(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。

請(qǐng)按照這樣的處理規(guī)則解釋下面語(yǔ)句運(yùn)行的結(jié)果:

x <- c(“123456789”, “abcdefghijklmnopq”)

substr(x, c(2, 4), c(4, 5, 8))

[1] “234” “de”

substring(x, c(2, 4), c(4, 5, 8))

[1] “234” “de” “2345678”

用substring函數(shù)可以很方便地把DNA/RNA序列進(jìn)行三聯(lián)拆分(用于蛋白質(zhì)翻譯):

bases <- c(“A”, “T”, “G”, “C”)

DNA <- paste(sample(bases, 12, replace = T), collapse = “”)

DNA

[1] “GCAGCGCATATG”

substring(DNA, seq(1, 10, by = 3), seq(3, 12, by = 3))

[1] “GCA” “GCG” “CAT” “ATG”

用regexpr戒努、gregexpr或regexec函數(shù)獲得位置信息后再進(jìn)行字符串提取的操作可以自己試試看请敦。

8 其他:

8.1 strtrim函數(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”

8.2 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] “l(fā)ines 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] “l(fā)ines 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."

8.3 match和charmatch

match(“xx”, c(“abc”, “xx”, “xxx”, “xx”))

[1] 2

match(2, c(3, 1, 2, 4))

[1] 3

charmatch(“xx”, “xx”)

[1] 1

charmatch(“xx”, “xxa”)

[1] 1

charmatch(“xx”, “axx”)

[1] NA

match按向量進(jìn)行運(yùn)算邀杏,返回第一次匹配的元素的位置(如果有),非字符向量也可用。charmatch函數(shù)真坑爹望蜡。其他不看了唤崭,其實(shí)有正則表達(dá)式就足夠。

END

有問(wèn)題脖律,歡迎留言谢肾。

每日更新(sql,R,python,databricks,sqlserver),感謝關(guān)注!P∪芦疏!

百家號(hào)更加精彩---ID:SL1談數(shù)據(jù)分析

---------------------------------------------------------------------------------------------

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市微姊,隨后出現(xiàn)的幾起案子酸茴,更是在濱河造成了極大的恐慌,老刑警劉巖兢交,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薪捍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡配喳,警方通過(guò)查閱死者的電腦和手機(jī)酪穿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晴裹,“玉大人被济,你說(shuō)我怎么就攤上這事〗牛” “怎么了只磷?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)少欺。 經(jīng)常有香客問(wèn)我喳瓣,道長(zhǎng),這世上最難降的妖魔是什么赞别? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任畏陕,我火速辦了婚禮,結(jié)果婚禮上仿滔,老公的妹妹穿的比我還像新娘惠毁。我一直安慰自己,他們只是感情好崎页,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布鞠绰。 她就那樣靜靜地躺著,像睡著了一般飒焦。 火紅的嫁衣襯著肌膚如雪蜈膨。 梳的紋絲不亂的頭發(fā)上屿笼,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音翁巍,去河邊找鬼驴一。 笑死,一個(gè)胖子當(dāng)著我的面吹牛灶壶,可吹牛的內(nèi)容都是我干的肝断。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼驰凛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼胸懈!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起恰响,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤趣钱,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后渔隶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體羔挡,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年间唉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片利术。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呈野,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出印叁,到底是詐尸還是另有隱情被冒,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布轮蜕,位于F島的核電站昨悼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏跃洛。R本人自食惡果不足惜率触,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望汇竭。 院中可真熱鬧葱蝗,春花似錦、人聲如沸细燎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)玻驻。三九已至悼凑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背户辫。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工渐夸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寸莫。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓捺萌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親膘茎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桃纯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容