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

熱線電話:13121318867

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

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

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

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

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

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

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

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

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

2.  一些特殊的字符在正則表達(dá)式中不在用來描述它自身,它們在正則表達(dá)式中已經(jīng)被“轉(zhuǎn)義”,這些字符稱為“元字符”。

perl類型的正則表達(dá)式中被轉(zhuǎn)義的字符有:. \ | ( ) [ ] { } ^ $ * + ?。被轉(zhuǎn)義的字符已經(jīng)有特殊的意義,如點(diǎn)號 . 表示任意字符;

方括號表示選擇方括號中的任意一個(如[a-z] 表示任意一個小寫字符);^ 放在表達(dá)式開始出表示匹配文本開始位置,放在方括號內(nèi)開始處表示非方括號內(nèi)的任一字符;大括號表示前面的字符或表達(dá)式的重復(fù)次數(shù);| 表示可選項(xiàng),即 | 前后的表達(dá)式任選一個。

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

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

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

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

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

\S 表示非空白字符,

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

\W 表示非字,

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

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


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

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

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

另外三個函數(shù)用法也很簡單:

    > 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)于其他語言的strjoin,但是功能更強(qiáng)大。它把向量連成字串向量,其他類型的數(shù)據(jù)會轉(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ù)只有一級列表能有好的表現(xiàn),能不能用看自己需要。會得到什么樣的結(jié)果是可以預(yù)知的,用as.character函數(shù)看吧,這又是一個字符串處理函數(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ù)還有一個用法,設(shè)置collapse參數(shù),連成一個字符串:

    > 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為字串向量,每個元素都將單獨(dú)進(jìn)行拆分。

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

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

參數(shù)useBytes設(shè)置是否逐個字節(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語言的字符串事實(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ù)的字符長度為0,得到的結(jié)果就是一個個的字符:

[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)成一個字符來處理的。
————————————————————————————————————————————————————————

四、字符串查詢:

1、grep和grepl函數(shù):

這兩個函數(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é)果不一樣。下來例子列出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

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

    > 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)格地說R語言沒有字符串替換的函數(shù),因?yàn)?a href='/map/r/' style='color:#000;font-size:inherit;'>R語言不管什么操作對參數(shù)都是傳值不傳址。

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

可以看到:雖然說是“替換”,但原字符串并沒有改變,要改變原變量我們只能通過再賦值的方式。

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

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

第 1個參數(shù)均為要拆分的字串向量,第2個參數(shù)為截取的起始位置向量,第3個參數(shù)為截取字串的終止位置向量。但它們的返回值的長度(個數(shù))有差 別:substr返回的字串個數(shù)等于第一個參數(shù)的長度;而substring返回字串個數(shù)等于三個參數(shù)中最長向量長度,短向量循環(huán)使用。先看第1參數(shù)(要 拆分的字符向量)長度為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)閤的向量長度為1,所以substr獲得的結(jié)果只有1個字串,即第2和第3個參數(shù)向量只用了第一個組合:起始位置2,終止位置4。

而substring的語句三個參數(shù)中最長的向量為c(4,5,8),執(zhí)行時按短向量循環(huán)使用的規(guī)則第一個參數(shù)事實(shí)上就是c(x,x,x),第二個參數(shù)就成了c(2,4,2),最終截取的字串起始位置組合為:2-4, 4-5和2-8。

請按照這樣的處理規(guī)則解釋下面語句運(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)換大小寫。

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

strtrim函數(shù)

用于將字符串修剪到特定的顯示寬度,其用法為strtrim(x, width),返回字符串向量的長度等于x的長度。因?yàn)槭恰靶藜簟?,所以只能去掉多余的字符不能增加其他額外的字符:如果字符串本身的長度小于 width,得到的是原字符串,別指望它會用空格或其他什么字符補(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ù)把一個字符串當(dāng)成一個段落的文字(不管字符串中是否有換行符),按照段落的格式(縮進(jìn)和長度)和斷字方式進(jìn)行分行,每一行是結(jié)果中的一個字符串。例如:數(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ù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號: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)的第一個參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時完成 $(".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 = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+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); }