R-tidyverse系列-stringr字符處理

stringr字符處理 - 簡書 (jianshu.com)
dplyr表格操作 - 簡書 (jianshu.com)

在正式學(xué)習(xí)stringr薇正、dplyr為代表的tidyrverse核心系列包時片酝,有必要先了解下正則表達(dá)式以及管道符的相關(guān)知識囚衔。

正則表達(dá)式

  • . : 可以匹配除換行符外的任意字符
  • ? :表示前面的模式(無特殊情況即單個字符)重復(fù)0 次或 1 次。
    + :1 次或多次雕沿。
    * :0 次或多次练湿。
    {n} :指定匹配 n 次。
    {n,} :指定匹配 n 次或更多次审轮。
    {,m} :指定最多匹配 m 次肥哎。
    {n, m} :指定匹配 n 到 m 次
  • ^ 從字符串開頭進(jìn)行匹配
    $ 從字符串末尾進(jìn)行匹配。
  • \d:匹配數(shù)字
    \s:可以匹配任意空白符
    \b:匹配單詞間的邊界

創(chuàng)建包含\(例如\d疾渣、\s...)的正則表達(dá)式篡诽,需要在字符串中對\進(jìn)行轉(zhuǎn)移,即\\d榴捡、\\s杈女。其實(shí)只要記住\\本質(zhì)上代表\即可。

匹配特殊字符示例

如果只是想匹配字符串本身的含義吊圾,fixed(正則表達(dá)式)可將正則表達(dá)式相關(guān)字符當(dāng)作純文本字符看待达椰。

  • [abc]:可以匹配a、b项乒,或c
    [^abc]:可以匹配除a啰劲、b,c外的任意字符
    [a-z] : 匹配任意小寫字母板丽;[A-Z]:任意大寫字母呈枉;[A-z]:任意字母
    |表示或,常搭配小括號埃碱,例如gr(e|a)y表示匹配grey或者gray

  • [:digit:]:匹配數(shù)字
    [:alpha:]:匹配字母
    [:lower:]:匹配小寫字母
    [:upper:]:匹配大寫字母
    [:alnum:]:匹配字母/數(shù)字
    [:punct:]:匹配標(biāo)點(diǎn)符號
    [:blank:]:匹配空格猖辫、tab
    [:space:]:匹配空格、tab砚殿、換行符

  • 最后的話啃憎,()小括號可以用于表示分組,\1表示回溯引用第一個分組似炎,具體用法可參考下面的str_match()函數(shù)的介紹辛萍。

fruit = c("apple","banana","pear","pineapple")
#查找具有ABAB模式的字符串
str_view(fruit,"(.)(.)\\1\\2", match = T)

注意:默認(rèn)的正則匹配方式都是“貪婪的”,即正則表達(dá)式會在符合規(guī)則的前提下匹配盡量長的字符串羡藐。通過在正則表達(dá)式后面添加一個 ? 贩毕,你可以將匹配方式更改為“懶惰的”,即匹配盡量短的字符串仆嗦。

管道符%>%

  • magrittr包提供的管道符語法對于R語言的代碼處理過程大大提高了效率辉阶,可通過下述方式查看內(nèi)置官方文檔;
?magrittr::`%>%
  • 在加載dplyr包時會自動加載magrittr包,從而便捷的使用管道符操作谆甜;
  • 管道符的含義理解垃僚,如下圖所示;


  • 相關(guān)筆記可參考 https://zhuanlan.zhihu.com/p/29845549

stringr字符處理

1规辱、字符串向量特征匹配
2谆棺、字符串特征匹配(取子集)
3、字符串的替換修改
4罕袋、字符串格式相關(guān)
5改淑、字符串拼接與拆分

library(stringr)

https://github.com/rstudio/cheatsheets/blob/master/strings.pdf

1、字符串向量特征匹配

對于一個字符串向量炫贤,判斷其中哪些字符串是否具有給定的模式特征

  • 1.1 str_detect():判斷每個字符串是否具有匹配模式溅固,返回等長的邏輯值向量
fruit <- c("apple", "banana", "pear", "pinapple")
str_detect(fruit, "a") #包含a的字符串
str_detect(fruit, "a", negate = T) #不包含a的字符串
str_detect(fruit, "^a") #以a開頭的字符串
str_detect(fruit, "[aeiou]") #含有aeiou其中任意一個字符的字符串
  • 1.2 str_starts()/str_ends():判斷每個字符串的開頭/結(jié)尾是否具有匹配模式,同樣返回等長的邏輯值向量
fruit <- c("apple", "banana", "pear", "pinapple")
str_starts(fruit, "p")
str_ends(fruit, "e")
  • 1.3 str_which()/str_subset():判斷向量里的哪個字符串具有匹配模式兰珍;前者返回數(shù)字序號侍郭,后者返回具體的字符串
# str_which == which(str_detect(x, pattern))
# str_detect == x[str_detect(x, pattern)]
fruit <- c("apple", "banana", "pear", "pinapple")
str_subset(fruit, "a")
str_which(fruit, "a")
  • 1.4 str_locate() : 返回匹配的模式在字符串的起始位置
fruit <- c("apple", "banana", "pear", "pineapple")
str_locate(fruit, "a")
str_locate_all(fruit, "a")
  • 1.5 str_count():返回每個字符串內(nèi)有多少個符合匹配模式組成
fruit <- c("apple", "banana", "pear", "pineapple")
str_count(fruit, "a")
str_count(fruit, c("a", "b", "p", "p")) #向量化操作

2、字符串特征匹配(取子集)

  • 2.1 str_sub():指定字符串的起始位置提取
hw <- "Hadley Wickham"
str_sub(hw, 1, 6)
str_sub(hw, -3, -1)
  • 2.2 str_extract() : 提取字符串里的特征模式
shopping_list <- c("apples x4", "bag of flour", "bag of sugar", "milk x2")
str_extract(shopping_list, "\\d")  #提取數(shù)字
str_extract(shopping_list, "[a-z]+") #提取1至多個小寫字母
str_extract(shopping_list, "[a-z]{1,4}") #貪婪匹配
str_extract(shopping_list, "[a-z]{1,4}?") #懶惰匹配
str_extract(shopping_list, "\\b[a-z]{1,4}\\b") #提取特征模式的單詞
str_extract(shopping_list, fixed("\\b[a-z]{1,4}\\b")) #fixed可將正則表達(dá)式視為普通字符串

#str_extract 默認(rèn)只提取字符串里第一個符合的模式
#str_extract_all可以提取全部的匹配
str_extract_all(shopping_list, "[a-z]+")
str_extract_all(shopping_list, "\\b[a-z]+\\b")
  • 2.3 str_match() : 可分組提取字符串里的特征模式掠河,更加靈活亮元。
    搭配括號使用,可提取分組的內(nèi)容唠摹。該函數(shù)返回一個矩陣:第一列是完整匹配爆捞,第二列及以后是每個分組(括號)的匹配。適用于啟發(fā)式的匹配提取勾拉,例如前綴煮甥、后綴等
str_match("bacad","b(a)")  #提取前一個字符為b的a
str_match("bacad","[^b](a)") ##提取前一個字符不為b的a
#回溯引用
str_match("banana","(a)(.)(\\1\\2)") #提取aXaX的模式文本,其中X可以是任何文本

3藕赞、字符串的替換修改

  • str_replace()
?str_replace #默認(rèn)只替換第一個模式的文本
?str_replace_all #全部
fruits = c("apple","banana","pear")
str_replace(fruits, "[aeiou]", "-")
#回溯應(yīng)用成肘,下面表示將a替換為aa,e替換為ee
str_replace(fruits, "([aeiou])", "\\1\\1")

#向量化一對一替換
str_replace(fruits, "[aeiou]", c("1", "2", "3"))
str_replace_all(fruits, "[aeiou]", c("1", "2", "3"))
str_replace(fruits, c("p", "e", "a"), "-") 
str_replace_all(fruits, c("p", "e", "a"), "-") 

#  多種特定模式的替換斧蜕,僅限于str_replace_all
fruits %>%
  str_c(collapse = "---") %>%
  str_replace_all(c("one" = "1", "two" = "2", "three" = "3"))

4双霍、字符串格式相關(guān)

  • 4.1 str_length():返回每個字符串的長度
str_length(c("i", "like", "programming", NA))
  • 4.2 str_pad():將字符串填補(bǔ)至指定長度,默認(rèn)用空格填充
rbind(
  str_pad("hadley", 30, "left"),
  str_pad("hadley", 30, "right"),
  str_pad("hadley", 30, "both")
)
str_pad("a", 10, pad = c("-", "_", " "))
  • 4.3 str_trunc():限制字符串的長度批销,用省略號代替
x <- "This string is moderately long"
rbind(
  str_trunc(x, 20, "right"),
  str_trunc(x, 20, "left"),
  str_trunc(x, 20, "center")
)
  • 4.4 str_trim():去除字符串兩邊的空格(包括tab洒闸、換行符);
    str_squish():去除字符串兩邊的空格(tab均芽、換行符),以及替換所有兩個以上的空格為一個空格
str_trim("  String with trailing and leading white space\t")
str_trim("\n\nString with trailing and leading white space\n\n")
str_squish("  String with trailing,  middle, and leading white space\t")
  • 4.5 str_wrap():將太長的英語句子限制為每行僅包含指定長度字符的若干行文本(本質(zhì)上即為自動插入換行符)丘逸;首要前提需要為包含空格的字符串
sentences[1]
cat(str_wrap(sentences[1],width = 10))
  • 4.6 str_glue():使用占位符格式化輸出,類似于sprintf()
name <- "Fred"
age <- 50
str_glue("My name is {name}, my age next year is {age + 1}")
mtcars[1:3,] %>% str_glue_data("{rownames(.)} has {hp} hp")
  • 4.7 大小寫轉(zhuǎn)換
dog <- "The quick brown dog"
##變大寫
str_to_upper(dog)
##變小寫
str_to_lower(dog)
##首字母大寫
str_to_title(dog)

5掀宋、字符串拼接與拆分

  • str_c():拼接兩個字符串深纲,默認(rèn)連接符為空白
str_c("Letter-", letters)
str_c("Letter", letters, sep = ": ")
str_c(letters, collapse = "")
  • str_dup() 重復(fù)字符串`
fruit <- c("apple", "pear", "banana")
str_dup(fruit, 2)
str_dup(fruit, 1:3)
  • str_split() 拆分字符串羞反,默認(rèn)返回的是list,可設(shè)置simplify=T參數(shù)返回矩陣
fruits <- c(
  "apples and oranges and pears and bananas",
  "pineapples and mangos and guavas"
)
str_split(fruits, " and ")
str_split(fruits, " and ", simplify=T)

#限定分割得到的字符串的數(shù)量(從左到右)
str_split(fruits, " and ", n = 2)
str_split(fruits, " and ", n = 3)
str_split(fruits, " and ", n = 5)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末囤萤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子是趴,更是在濱河造成了極大的恐慌涛舍,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唆途,死亡現(xiàn)場離奇詭異富雅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)肛搬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門没佑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人温赔,你說我怎么就攤上這事蛤奢。” “怎么了陶贼?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵啤贩,是天一觀的道長。 經(jīng)常有香客問我拜秧,道長痹屹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任枉氮,我火速辦了婚禮志衍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘聊替。我一直安慰自己楼肪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布佃牛。 她就那樣靜靜地躺著淹辞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪俘侠。 梳的紋絲不亂的頭發(fā)上象缀,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機(jī)與錄音爷速,去河邊找鬼央星。 笑死,一個胖子當(dāng)著我的面吹牛惫东,可吹牛的內(nèi)容都是我干的莉给。 我是一名探鬼主播毙石,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼颓遏!你這毒婦竟也來了徐矩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤叁幢,失蹤者是張志新(化名)和其女友劉穎滤灯,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體曼玩,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鳞骤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了黍判。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豫尽。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖顷帖,靈堂內(nèi)的尸體忽然破棺而出美旧,到底是詐尸還是另有隱情,我是刑警寧澤贬墩,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布陈症,位于F島的核電站,受9級特大地震影響震糖,放射性物質(zhì)發(fā)生泄漏录肯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一吊说、第九天 我趴在偏房一處隱蔽的房頂上張望论咏。 院中可真熱鬧,春花似錦颁井、人聲如沸厅贪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽养涮。三九已至,卻和暖如春眉抬,著一層夾襖步出監(jiān)牢的瞬間贯吓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工蜀变, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悄谐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓库北,卻偏偏與公主長得像爬舰,于是被迫代替她去往敵國和親们陆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

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