第10章 使用stringr處理字符串P2

第10章 使用stringr處理字符串

要到正則表達式了!緊不緊張!刺不刺激 :)

使用正則表達式進行模式匹配

準備工作

library(tidverse)
library(stringr)

主要是通過兩個函數str_view()和str_view_all() 首先用help函數自學一下!

x <- c("apple","banana","pear")

思考一下,我想要提取其中的apple字符可以用幾種方式?最簡單的就是x[[1]]
但是這里有一個bug,就是我們已經知道了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函數內部是一個if循環加上identical函數、str_detect函數,str_locate函數、str_sub函數、paste0函數。這些基本就構成了要學習的內容。當然關于paste0函數的問題答案有,自己去看看嘍。

function (string, pattern, match = NA) 
{
    if (identical(match, TRUE)) {
        string <- string[str_detect(string, pattern)] #提取了match=TRUE的內容
    }
    else if (identical(match, FALSE)) {
        string <- string[!str_detect(string, pattern)] #提取了match=FALSE的內容
    }
    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>

這里書上先介紹了為什么“”或者’‘在里面不能算是一個字符型的向量,也介紹了如果想表示應該如何進行表達。其實這里面的轉義運用的就是后邊要介紹的正則表達式。所以讀到這里很懵b的狀態也沒關系。

基礎匹配

上面說用到了str_view()函數來匹配x中apple字符。如果我想要匹配所有an的單詞?應該怎么辦?書上寫的很明白了,結合上面的應該能看懂。
后邊又使用了正則表達式中的.來代表任意字符。
其實我感覺,這書為什么不把正則表達式放在前面講。。。

. 可以匹配任何單個的字符字母數字甚至.字符本身。同一個正則表達式允許使用多個.字符。但不能匹配換行
\ 轉義字符,如果要匹配就要寫成“\(\)”
| 表示可選項,即|前后的表達式任選一個
^ 取非匹配
$ 放在句尾,表示一行字符串的結束
() 提取匹配的字符串,(\s*)表示連續空格的字符串
[] 選擇方括號中的任意一個(如[0-2]和[012]完全等價,[Rr]負責匹配字母R和r)
{} 前面的字符或表達式的重復次數。如{5,12}表示重復的次數不能小于5,不能多于12,否則都不匹配
*(星號) 匹配零個或任意多個字符或字符集合,也可以沒有匹配
+(加號) 匹配一個或多個字符,至少匹配一次
? 匹配零個或一個字符

關于元字符的概念和意義我就不在這里說了,我也說不明白啊!但是記住如果你想表達上述正則表達式的字符需要用轉義符號/來表示,用writeLines()函數可以看見表達的意思。
書上舉了非常極端的////的例子,讀到這的時候樂懵b了....
這兩個博客講的都很不錯,我的表格也是來自于這個博客。

https://www.cnblogs.com/wheng/p/6262737.html
https://www.cnblogs.com/nkwy2012/p/8601562.html

錨點、字符類和字符選項、重復

錨點主要是告訴正則表達式你匹配的字符的位置,你是想匹配開頭^還是結尾$出現a的字母啊!這里出現了一個/b來表示邊界的問題。
字符型和字符選項主要是告訴正則表達式匹配的字符是什么類型的,是數字型啊?還是空白字符啊?還是巴拉巴拉?
這里有一個需要特殊記憶[^abc]代表匹配除了abc以外的任意字符。
重復就是告訴這個匹配的a是重復幾次啊?有沒有重復次數啊?

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 以前
    在下星軌閱讀 212評論 0 0
  • 下雪了,但是卻沒有人陪著一起看雪,曾經你的身影已漸漸模糊,我用力回憶,卻終究還是想不起來。時間讓這些記憶在腦海里的...
    夜曉瑯閱讀 267評論 0 0
  • 何謂誠實?即誠實守信。誠實,即忠誠老實,就是忠于事物的本來面貌,不隱瞞自己的真實思想,不掩飾自己的真實感情,不說謊...
    Sunny仔仔閱讀 1,114評論 1 4