第10章 使用stringr處理字符串
要到正則表達(dá)式了啸澡!緊不緊張拜效!刺不刺激 :)
使用正則表達(dá)式進(jìn)行模式匹配
準(zhǔn)備工作
library(tidverse)
library(stringr)
主要是通過兩個函數(shù)str_view()和str_view_all() 首先用help函數(shù)自學(xué)一下原朝!
x <- c("apple","banana","pear")
思考一下,我想要提取其中的apple字符可以用幾種方式?最簡單的就是x[[1]]
但是這里有一個bug,就是我們已經(jīng)知道了apple字符所在的向量中的位置
如果我們不知道呢袍嬉?
str_view(x,"apple")
str_detect(x, "apple")
[1] TRUE FALSE FALSE
str_locate(x, "apple")
start end
[1,] 1 5
[2,] NA NA
[3,] NA NA
identical
str_view函數(shù)內(nèi)部是一個if循環(huán)加上identical函數(shù)、str_detect函數(shù)灶平,str_locate函數(shù)阎姥、str_sub函數(shù)、paste0函數(shù)鸭丛。這些基本就構(gòu)成了要學(xué)習(xí)的內(nèi)容眉抬。當(dāng)然關(guān)于paste0函數(shù)的問題答案有,自己去看看嘍瞒爬。
function (string, pattern, match = NA)
{
if (identical(match, TRUE)) {
string <- string[str_detect(string, pattern)] #提取了match=TRUE的內(nèi)容
}
else if (identical(match, FALSE)) {
string <- string[!str_detect(string, pattern)] #提取了match=FALSE的內(nèi)容
}
loc <- str_locate(string, pattern) #查看匹配字符的位置
has_match <- !is.na(loc[, "start"])# 提取loc中start位置弓柱,并且再次提取不是na的值
str_sub(string[has_match], loc[has_match, , drop = FALSE]) <- paste0("<span class='match'>",
str_sub(string[has_match], loc[has_match, , drop = FALSE]),
"</span>")
str_view_widget(string)
}
<bytecode: 0x0000000008ec0e90>
<environment: namespace:stringr>
這里書上先介紹了為什么“”或者’‘在里面不能算是一個字符型的向量,也介紹了如果想表示應(yīng)該如何進(jìn)行表達(dá)侧但。其實這里面的轉(zhuǎn)義運用的就是后邊要介紹的正則表達(dá)式矢空。所以讀到這里很懵b的狀態(tài)也沒關(guān)系。
基礎(chǔ)匹配
上面說用到了str_view()函數(shù)來匹配x中apple字符禀横。如果我想要匹配所有an的單詞屁药?應(yīng)該怎么辦?書上寫的很明白了燕侠,結(jié)合上面的應(yīng)該能看懂者祖。
后邊又使用了正則表達(dá)式中的.來代表任意字符。
其實我感覺绢彤,這書為什么不把正則表達(dá)式放在前面講七问。。茫舶。
. 可以匹配任何單個的字符字母數(shù)字甚至.字符本身。同一個正則表達(dá)式允許使用多個.字符。但不能匹配換行
\ 轉(zhuǎn)義字符讥耗,如果要匹配就要寫成“\(\)”
| 表示可選項有勾,即|前后的表達(dá)式任選一個
^ 取非匹配
$ 放在句尾,表示一行字符串的結(jié)束
() 提取匹配的字符串古程,(\s*)表示連續(xù)空格的字符串
[] 選擇方括號中的任意一個(如[0-2]和[012]完全等價蔼卡,[Rr]負(fù)責(zé)匹配字母R和r)
{} 前面的字符或表達(dá)式的重復(fù)次數(shù)。如{5,12}表示重復(fù)的次數(shù)不能小于5挣磨,不能多于12雇逞,否則都不匹配
*(星號) 匹配零個或任意多個字符或字符集合,也可以沒有匹配
+(加號) 匹配一個或多個字符茁裙,至少匹配一次
? 匹配零個或一個字符
關(guān)于元字符的概念和意義我就不在這里說了塘砸,我也說不明白啊晤锥!但是記住如果你想表達(dá)上述正則表達(dá)式的字符需要用轉(zhuǎn)義符號/來表示掉蔬,用writeLines()函數(shù)可以看見表達(dá)的意思。
書上舉了非常極端的////的例子矾瘾,讀到這的時候樂懵b了....
這兩個博客講的都很不錯女轿,我的表格也是來自于這個博客。
https://www.cnblogs.com/wheng/p/6262737.html
https://www.cnblogs.com/nkwy2012/p/8601562.html
錨點霜威、字符類和字符選項谈喳、重復(fù)
錨點主要是告訴正則表達(dá)式你匹配的字符的位置,你是想匹配開頭^還是結(jié)尾$出現(xiàn)a的字母案昶谩!這里出現(xiàn)了一個/b來表示邊界的問題赏僧。
字符型和字符選項主要是告訴正則表達(dá)式匹配的字符是什么類型的大猛,是數(shù)字型啊淀零?還是空白字符巴旒ā?還是巴拉巴拉驾中?
這里有一個需要特殊記憶[^abc]代表匹配除了abc以外的任意字符唉堪。
重復(fù)就是告訴這個匹配的a是重復(fù)幾次啊肩民?有沒有重復(fù)次數(shù)斑胙恰?