99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀 R語(yǔ)言:文本(字符串)處理與正則表達(dá)式
R語(yǔ)言:文本(字符串)處理與正則表達(dá)式
2017-04-25
收藏

 R語(yǔ)言:文本(字符串)處理與正則表達(dá)式

處理文本是每一種計(jì)算機(jī)語(yǔ)言都應(yīng)該具備的功能,但不是每一種語(yǔ)言都側(cè)重于處理文本。R語(yǔ)言是統(tǒng)計(jì)的語(yǔ)言,處理文本不是它的強(qiáng)項(xiàng),perl語(yǔ)言這方面的功能比R不知要強(qiáng)多少倍。幸運(yùn)的是R語(yǔ)言的可擴(kuò)展能力很強(qiáng),DNA/RNA/AA等生物序列現(xiàn)在已經(jīng)可以使用R來(lái)處理。

nchar     字符的個(gè)數(shù)
toupper     轉(zhuǎn)換為大寫字符
tolower     轉(zhuǎn)換為小寫字符
substr     求字符串的字串
grep     基于正則表達(dá)式的匹配
sub     基于正則表達(dá)式的替換
strsplit     字符串分割
paste     字符向量連接
match     匹配元素位置組成的向量

R語(yǔ)言處理文本的能力雖然不強(qiáng),但適當(dāng)用用還是可以大幅提高工作效率的,而且有些文本操作還不得不用。高效處理文本少不了正則表達(dá)式(regular expression),雖然R在這方面先天不高效,但它處理字符串的絕大多數(shù)函數(shù)都使用正則表達(dá)式。

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

正則表達(dá)式不是R的專屬內(nèi)容,所以用0編號(hào),這里也只簡(jiǎn)單介紹,更詳細(xì)的內(nèi)容請(qǐng)查閱其他文章。

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

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

2.  一些特殊的字符在正則表達(dá)式中不在用來(lái)描述它自身,它們?cè)?a href='/map/zhengzebiaodashi/' style='color:#000;font-size:inherit;'>正則表達(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è)。

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

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

如 \d 表示數(shù)字0-9,

\D 表示非數(shù)字,

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

\S 表示非空白字符,

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

\W 表示非字,

\< 和 \> 分別表示以空白字符開始和結(jié)束的文本。

5.  正則表達(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‘。


元字符
    
描述
\
    
將下一個(gè)字符標(biāo)記符、或一個(gè)向后引用、或一個(gè)八進(jìn)制轉(zhuǎn)義符。例如,“\\n”匹配\n?!癨n”匹配換行符。序列“\\”匹配“\”而“\(”則匹配“(”。即相當(dāng)于多種編程語(yǔ)言中都有的“轉(zhuǎn)義字符”的概念。
^
    
匹配輸入字符串的開始位置。如果設(shè)置了RegExp對(duì)象的Multiline屬性,^也匹配“\n”或“\r”之后的位置。
$
    
匹配輸入字符串的結(jié)束位置。如果設(shè)置了RegExp對(duì)象的Multiline屬性,$也匹配“\n”或“\r”之前的位置。
*
    
匹配前面的子表達(dá)式任意次。例如,zo*能匹配“z”,也能匹配“zo”以及“zoo”。
+
    
匹配前面的子表達(dá)式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價(jià)于{1,}。
?
    
匹配前面的子表達(dá)式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等價(jià)于{0,1}。
{n}
    
n是一個(gè)非負(fù)整數(shù)。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個(gè)o。
{n,}
    
n是一個(gè)非負(fù)整數(shù)。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等價(jià)于“o+”。“o{0,}”則等價(jià)于“o*”。
{n,m}
    
m和n均為非負(fù)整數(shù),其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個(gè)o?!皁{0,1}”等價(jià)于“o?”。請(qǐng)注意在逗號(hào)和兩個(gè)數(shù)之間不能有空格。
?
    
當(dāng)該字符緊跟在任何一個(gè)其他限制符(*,+,?,{n},{n,},{n,m})后面時(shí),匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對(duì)于字符串“oooo”,“o+?”將匹配單個(gè)“o”,而“o+”將匹配所有“o”。
.點(diǎn)
    
匹配除“\r\n”之外的任何單個(gè)字符。要匹配包括“\r\n”在內(nèi)的任何字符,請(qǐng)使用像“[\s\S]”的模式。
(pattern)
    
匹配pattern并獲取這一匹配。所獲取的匹配可以從產(chǎn)生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。要匹配圓括號(hào)字符,請(qǐng)使用“”或“”。
(?:pattern)
    
非獲取匹配,匹配pattern但不獲取匹配結(jié)果,不進(jìn)行存儲(chǔ)供以后使用。這在使用或字符“(|)”來(lái)組合一個(gè)模式的各個(gè)部分是很有用。例如“industr(?:y|ies)”就是一個(gè)比“industry|industries”更簡(jiǎn)略的表達(dá)式。
(?=pattern)
    
非獲取匹配,正向肯定預(yù)查,在任何匹配pattern的字符串開始處匹配查找字符串,該匹配不需要獲取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預(yù)查不消耗字符,也就是說(shuō),在一個(gè)匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開始。
(?!pattern)
    
非獲取匹配,正向否定預(yù)查,在任何不匹配pattern的字符串開始處匹配查找字符串,該匹配不需要獲取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。
(?<=pattern)
    
非獲取匹配,反向肯定預(yù)查,與正向肯定預(yù)查類似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
(?<!pattern)
    
非獲取匹配,反向否定預(yù)查,與正向否定預(yù)查類似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。這個(gè)地方不正確,有問題
此處用或任意一項(xiàng)都不能超過(guò)2位,如“(?<!95|98|NT|20)Windows正確,“(?<!95|980|NT|20)Windows 報(bào)錯(cuò),若是單獨(dú)使用則無(wú)限制,如(?<!2000)Windows 正確匹配
x|y
    
匹配x或y。例如,“z|food”能匹配“z”或“food”(此處請(qǐng)謹(jǐn)慎)。“(z|f)ood”則匹配“zood”或“food”。
[xyz]
    
字符集合。匹配所包含的任意一個(gè)字符。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz]
    
負(fù)值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。
[a-z]
    
字符范圍。匹配指定范圍內(nèi)的任意字符。例如,“[a-z]”可以匹配“a”到“z”范圍內(nèi)的任意小寫字母字符。
注意:只有連字符在字符組內(nèi)部時(shí),并且出現(xiàn)在兩個(gè)字符之間時(shí),才能表示字符的范圍; 如果出字符組的開頭,則只能表示連字符本身.
[^a-z]
    
負(fù)值字符范圍。匹配任何不在指定范圍內(nèi)的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范圍內(nèi)的任意字符。
\b
    
匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置(即正則表達(dá)式的“匹配”有兩種概念,一種是匹配字符,一種是匹配位置,這里的\b就是匹配位置的)。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
\B
    
匹配非單詞邊界?!癳r\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
\cx
    
匹配由x指明的控制字符。例如,\cM匹配一個(gè)Control-M或回車符。x的值必須為A-Z或a-z之一。否則,將c視為一個(gè)原義的“c”字符。
\d
    
匹配一個(gè)數(shù)字字符。等價(jià)于[0-9]。grep 要加上-P,perl正則支持
\D
    
匹配一個(gè)非數(shù)字字符。等價(jià)于[^0-9]。grep要加上-Pperl正則支持
\f
    
匹配一個(gè)換頁(yè)符。等價(jià)于\x0c和\cL。
\n
    
匹配一個(gè)換行符。等價(jià)于\x0a和\cJ。
\r
    
匹配一個(gè)回車符。等價(jià)于\x0d和\cM。
\s
    
匹配任何不可見字符,包括空格、制表符、換頁(yè)符等等。等價(jià)于[ \f\n\r\t\v]。
\S
    
匹配任何可見字符。等價(jià)于[^ \f\n\r\t\v]。
\t
    
匹配一個(gè)制表符。等價(jià)于\x09和\cI。
\v
    
匹配一個(gè)垂直制表符。等價(jià)于\x0b和\cK。
\w
    
匹配包括下劃線的任何單詞字符。類似但不等價(jià)于“[A-Za-z0-9_]”,這里的"單詞"字符使用Unicode字符集。
\W
    
匹配任何非單詞字符。等價(jià)于“[^A-Za-z0-9_]”。
\xn
    
匹配n,其中n為十六進(jìn)制轉(zhuǎn)義值。十六進(jìn)制轉(zhuǎn)義值必須為確定的兩個(gè)數(shù)字長(zhǎng)。例如,“\x41”匹配“A”。“\x041”則等價(jià)于“\x04&1”。正則表達(dá)式中可以使用ASCII編碼。
\num
    
匹配num,其中num是一個(gè)正整數(shù)。對(duì)所獲取的匹配的引用。例如,“(.)\1”匹配兩個(gè)連續(xù)的相同字符。
\n
    
標(biāo)識(shí)一個(gè)八進(jìn)制轉(zhuǎn)義值或一個(gè)向后引用。如果\n之前至少n個(gè)獲取的子表達(dá)式,則n為向后引用。否則,如果n為八進(jìn)制數(shù)字(0-7),則n為一個(gè)八進(jìn)制轉(zhuǎn)義值。
\nm
    
標(biāo)識(shí)一個(gè)八進(jìn)制轉(zhuǎn)義值或一個(gè)向后引用。如果\nm之前至少有nm個(gè)獲得子表達(dá)式,則nm為向后引用。如果\nm之前至少有n個(gè)獲取,則n為一個(gè)后跟文字m的向后引用。如果前面的條件都不滿足,若n和m均為八進(jìn)制數(shù)字(0-7),則\nm將匹配八進(jìn)制轉(zhuǎn)義值nm。
\nml
    
如果n為八進(jìn)制數(shù)字(0-7),且m和l均為八進(jìn)制數(shù)字(0-7),則匹配八進(jìn)制轉(zhuǎn)義值nml。
\un
    
匹配n,其中n是一個(gè)用四個(gè)十六進(jìn)制數(shù)字表示的Unicode字符。例如,\u00A9匹配版權(quán)符號(hào)(&copy;)。
\p{P}
    
小寫 p 是 property 的意思,表示 Unicode 屬性,用于 Unicode 正表達(dá)式的前綴。中括號(hào)內(nèi)的“P”表示Unicode 字符集七個(gè)字符屬性之一:標(biāo)點(diǎn)字符。
其他六個(gè)屬性:
L:字母;
M:標(biāo)記符號(hào)(一般不會(huì)單獨(dú)出現(xiàn));
Z:分隔符(比如空格、換行等);
S:符號(hào)(比如數(shù)學(xué)符號(hào)、貨幣符號(hào)等);
N:數(shù)字(比如阿拉伯?dāng)?shù)字、羅馬數(shù)字等);
C:其他字符。
*注:此語(yǔ)法部分語(yǔ)言不支持,例:javascript。
< >     匹配詞(word)的開始(<)和結(jié)束(>)。例如正則表達(dá)式<the>能夠匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:這個(gè)元字符不是所有的軟件都支持的。
( )     將( 和 ) 之間的表達(dá)式定義為“組”(group),并且將匹配這個(gè)表達(dá)式的字符保存到一個(gè)臨時(shí)區(qū)域(一個(gè)正則表達(dá)式中最多可以保存9個(gè)),它們可以用 \1 到\9 的符號(hào)來(lái)引用。
|     將兩個(gè)匹配條件進(jìn)行邏輯“或”(Or)運(yùn)算。例如正則表達(dá)式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。注意:這個(gè)元字符不是所有的軟件都支持的。
+     匹配1或多個(gè)正好在它之前的那個(gè)字符。例如正則表達(dá)式9+匹配9、99、999等。注意:這個(gè)元字符不是所有的軟件都支持的。
?     匹配0或1個(gè)正好在它之前的那個(gè)字符。注意:這個(gè)元字符不是所有的軟件都支持的。
{i} {i,j}     匹配指定數(shù)目的字符,這些字符是在它之前的表達(dá)式定義的。例如正則表達(dá)式A[0-9]{3} 能夠匹配字符"A"后面跟著正好3個(gè)數(shù)字字符的串,例如A123、A348等,但是不匹配A1234。而正則表達(dá)式[0-9]{4,6} 匹配連續(xù)的任意4個(gè)、5個(gè)或者6個(gè)數(shù)字
(摘自《正則表達(dá)式之道》)
————————————————————————————————————————————————————————
一、字符數(shù)統(tǒng)計(jì)和字符翻譯

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

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

另外三個(gè)函數(shù)用法也很簡(jiǎn)單:

    > DNA <- "AtGCtttACC"
    > tolower(DNA)
    [1] "atgctttacc"
    > toupper(DNA)
    [1] "ATGCTTTACC"
    > chartr("Tt", "Uu", DNA)
    [1] "AuGCuuuACC"
    > chartr("Tt", "UU", DNA)
    [1] "AUGCUUUACC"
————————————————————————————————————————————————————————
二、字符串連接
paste應(yīng)該是R中最常用字符串函數(shù)了,也是R字符串處理函數(shù)里面非常純的不使用正則表達(dá)式的函數(shù)(因?yàn)橛貌恢?。它相?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=":")   #這樣的結(jié)果不知合不合用
    [1] "T:list(a = \"aaa\", b = \"bbb\", c = \"ccc\")"
    [2] "T:list(d = 1, e = 2)"

短向量重復(fù)使用,列表數(shù)據(jù)只有一級(jí)列表能有好的表現(xiàn),能不能用看自己需要。會(huì)得到什么樣的結(jié)果是可以預(yù)知的,用as.character函數(shù)看吧,這又是一個(gè)字符串處理函數(shù):

    > as.character(x)
    [1] "aaa" "bbb" "ccc"
    > as.character(z)
    [1] "list(a = \"aaa\", b = \"bbb\", c = \"ccc\")"
    [2] "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"
————————————————————————————————————————————————————————
三、字符串拆分

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)。如果你沒接觸過(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)行匹配。

下面的例子把一句話按空格拆分為單詞:

[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片

    > text <- "Hello Adam!\nHello Ava!"  
      
    > strsplit(text, ' ')  
      
    [[1]]  
      
    [1] "Hello"        "Adam!\nHello" "Ava!"      

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

[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片

    > strsplit(text, '\\s')  
      
    [[1]]  
      
    [1] "Hello" "Adam!" "Hello" "Ava!"   

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

[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片

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

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

[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片

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

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

四、字符串查詢:

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  57  68  98  99 101 110 111 114 116
    > grepl("\\.exe$", files)
      [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
     [14] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    #......

grep僅返回匹配項(xiàng)的下標(biāo),而grepl返回所有的查詢結(jié)果,并用邏輯向量表示有沒有找到匹配。兩者的結(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"

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

五、字符串替換

雖然sub和gsub是用于字符串替換的函數(shù),但嚴(yán)格地說(shuō)R語(yǔ)言沒有字符串替換的函數(shù),因?yàn)?a href='/map/r/' style='color:#000;font-size:inherit;'>R語(yǔ)言不管什么操作對(duì)參數(shù)都是傳值不傳址。

    > text
    [1] "Hello Adam!\nHello Ava!"
    > sub(pattern="Adam", replacement="world", text)
    [1] "Hello world!\nHello Ava!"
    > text
    [1] "Hello Adam!\nHello Ava!"

可以看到:雖然說(shuō)是“替換”,但原字符串并沒有改變,要改變?cè)兞课覀冎荒芡ㄟ^(guò)再賦值的方式。

sub和gsub的區(qū)別是前者只做一次替換(不管有幾次匹配),而gsub把滿足條件的匹配都做替換:

    > sub(pattern="Adam|Ava", replacement="world", text)
    [1] "Hello world!\nHello Ava!"
    > gsub(pattern="Adam|Ava", replacement="world", text)
    [1] "Hello world!\nHello world!"

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

> sub(pattern=".*(Adam).*", replacement="\\1", text)

[1] "Adam"

六、字符串提取

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

    substr(x, start, stop)
    substring(text, first, last = 1000000L)

第 1個(gè)參數(shù)均為要拆分的字串向量,第2個(gè)參數(shù)為截取的起始位置向量,第3個(gè)參數(shù)為截取字串的終止位置向量。但它們的返回值的長(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] "CCTTTACGGTGT"
    > substring(DNA, seq(1,10,by=3), seq(3,12,by=3))
    [1] "CCT" "TTA" "CGG" "TGT"

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

比如strtrim、strwrap、charmatch、match和pmatch等,甚至是 %in% 運(yùn)算符都是可以使用的。R的在線幫助很全,自己看吧,就當(dāng)學(xué)習(xí)E文。
————————————————————————————————————————————————————————

字符串替換函數(shù):chartr( )

chartr( )函數(shù):將原有字符串中特定字符替換成所需要的字符。

其中參數(shù)old 表示原有字符串中內(nèi)容;new 表示替換后的字符內(nèi)容。

大小寫替換函數(shù):toupper( )、tolower( )、casefold( )

toupper( )函數(shù):將字符串統(tǒng)一轉(zhuǎn)換為大寫。

tolower( )函數(shù):將字符串統(tǒng)一轉(zhuǎn)換為小寫。

casefold( )函數(shù):根據(jù)參數(shù)轉(zhuǎn)換大小寫。

來(lái)自:每R一點(diǎn):R語(yǔ)言中的字符串處理函數(shù)

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"

strwrap函數(shù)

該函數(shù)把一個(gè)字符串當(dāng)成一個(gè)段落的文字(不管字符串中是否有換行符),按照段落的格式(縮進(jìn)和長(zhǎng)度)和斷字方式進(jìn)行分行,每一行是結(jié)果中的一個(gè)字符串。例如:數(shù)據(jù)分析師培訓(xùn)
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)

數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }