正則表達式表通常被用來檢索、替換那些符合某個模式(規則)的文本。在我看來,正則表達式的主要用途有兩種:①查找特定的信息②查找並編輯特定的信息,也就是我們經常用的替換。。比如我們要在Word,記事本等裡面使用快捷鍵Ctrl+F,進行查找一個特定的字符,或者替換一個字符,這就使用了正則表達式。
正則表達式的功能非常強大,尤其是在文本數據進行處理中顯得更加突出。R中的grep、grepl、sub、gsub、regexpr、gregexpr等函數都使用正則表達式的規則進行匹配。這幾個函數原型如下:
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)sub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE)gsub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE)regexpr(pattern, text, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE)gregexpr(pattern, text, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE)regexec(pattern, text, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE)這裡是對參數進行一個解釋說明。
參數
說明
pattern
正則表達式
x, text
字符向量或字符對象,在R 3.0.0後版本中,最大支持超過2^31個的字符元素。
ignore.case
默認FALSE,表示區分大小寫,TRUE時表示不區分大小寫。
perl
是否使用Perl兼容的正則表達式
value
默認為FALSE,當查找到時返回1,否則返回0;當為TRUE查找到時返回整個x,text,否則返回0。
fixed
如果為TRUE,pattern是要匹配的字符串。覆蓋所有衝突的參數
useBytes
默認為false,當為true時,則是逐字節逐字節匹配而不是逐字符逐字符匹配。
invert
如果TRUE返回不匹配的元素的索引或值。
replacement
如果查找到之後,進行替換,若沒有找到,則返回x,text值
接下來我們對這幾個函數談談他們的不同點。
函數
作用
grep()
查找,存在參數value,返回結果是匹配項的下標
grepl()
查找,返回值為true
sub()
只對查找到的第一個內容進行替換。(同下)
gsub()
對查找到的所有內容進行替換,返回替換後的text;否則直接返回text
regexpr()
返回一個與給出第一個匹配的起始位置的文本長度相同的整數向量,如果沒有則返回-1, 「match.length」給出匹配文本長度的整數向量(或-1)。匹配位置和長度為字符。
除了regexec,目前不支持Perl風格()的正則表達式。
。useBytes的主要效果是避免關於多字節語言環境中的無效輸入和偽匹配的錯誤/警告,但對於regexpr,它會更改輸出的解釋。它禁止具有標記編碼的輸入的轉換,並且如果發現任何輸入被標記為「字節」,則被強制參見編碼)。
無關匹配對多字節語言環境中的字節沒有多大意義,如果useBytes = TRUE,您應該希望它只適用於ASCII字符。
regexpr和gregexpr與perl = TRUE允許Python風格的命名捕獲,但不是長矢量輸入。
當前語言環境中的無效輸入最多警告5次。
對於非ASCII字符,與PERL = TRUE的無符號匹配取決於使用「Unicode屬性支持」編譯的PCRE庫:外部庫可能不是。
如果你正在做很多的正則表達式匹配,包括非常長的字符串,通常將正則表達式引擎設為PCRE,這將將比默認正則表達式引擎快,而fixed = TRUE更快(特別是當每個模式只匹配幾次時)。
gregexpr()
返回一個與文本長度相同的列表,每個元素的格式與regexpr的返回值相同,除了給出了每個(不相交)匹配的起始位置。
regexec()
返回與文本相同長度的列表,如果沒有匹配,則返回-1,或者具有匹配的起始位置的整數序列和對應於模式的括號子表達式的所有子串,其中屬性「match .length「給出匹配長度的向量(或沒有匹配的-1)。
正則表達式轉義字符 空白元字符[\b]回退(並刪除)一個字符(backspace)\f換頁符\n換行符\r回車符\t制表符(tab)\v垂直制表符註:\r\n是windows所用的文本行結束符,Unix和Linux只是用一個換行符來結束一個文本行匹配數字與非數字\d任何一個數字字符,等價於[0-9]\D任何一個非數字字符,等價於^[0-9]匹配字母\非字母與數字\w任何一個字母數字字符(大小寫均可以)或下劃線字符(等價於[a-zA-Z0-9])\W任何一個非字母數字或下劃線字符(等價於[^a-zA-Z0-9])匹配空白字符\s任何一個空白字符(等價於[\f\n\r\t\v])\S任何一個非空白字符(等價於[^\f\n\r\t\v])POSIX字符類[:alnum:]任何一個字母或數字(等價於[a-ZA-Z0-9])[:alpha:]任何一個字母(等價於[a-ZA-Z])[:blank:]空格或制表符(等價於[\t ]) 注:t後面有一個空格[:cntrl:]ASCII控制字符(ASCII 0到31,再加上ASCII 127)[:digit:]任何一個數字(等價於[0-9])[:graph:]和[:print:]一樣,但不包括空格[:lower:]任何一個小寫字母(等價於[a-z])[:print:]任何一個可列印字符[:punct:]既不屬於[:alnum:],也不屬於[:cntrl:]的任何一個字符[:space:]任何一個空格字符,包括空格(等價於[f\n\r\t\v ] 注:v後面有一個空格[:upper:]任何一個大寫字母(等價於[A-Z])[:xdigit:]任何一個十六進位數字(等價於[a-fA-F0-9])其他.可以匹配任何單個的字符字母數字甚至.字符本身。同一個正則表達式允許使用多個.字符。但不能匹配換行\\轉義字符,如果要匹配就要寫成「\\(\\)」|表示可選項,即|前後的表達式任選一個^取非匹配$放在句尾,表示一行字符串的結束()提取匹配的字符串,(\\s*)表示連續空格的字符串[]選擇方括號中的任意一個(如[0-2]和[012]完全等價,[Rr]負責匹配字母R和r){}前面的字符或表達式的重複次數。如{5,12}表示重複的次數不能小於5,不能多於12,否則都不匹配*匹配零個或任意多個字符或字符集合,也可以沒有匹配+匹配一個或多個字符,至少匹配一次?匹配零個或一個字符現在來舉幾個例子。
首先使用[]中括號的功能,來查找一下看有沒有do組合的單詞。
text<-c("Don't","aim","for","success","if","you","want","it","just","do","what","you","love", "and","believe","in","and","it","will","come","naturally")#查找含有DO組合的單詞grep("[Dd]o",text)#不區分大小寫grep("[D]o",text)#D要大寫grep("[d]o",text)#D小寫
運行結果如下:> text<-c("Don't","aim","for","success","if","you","want","it","just","do","what",
"you","love","and","believe","in","and","it","will","come","naturally")> > #查找含有DO組合的單詞> grep("[Dd]o",text)#不區分大小寫[1] 1 10> grep("[D]o",text)#D要大寫[1] 1> grep("[d]o",text)#D小寫[1] 10
郵箱匹配:
#郵箱匹配:text2<-c("704232753@qq.com is my email address.")grepl("[0-9.*]+@[a-z.*].[a-z.*]",text2)結果如下
> text2<-c("704232753@qq.com is my email address.")> grepl("[0-9.*]+@[a-z.*].[a-z.*]",text2)[1] TRUE
說明可以查找到了。
至於其他函數大家可以自己去試試,遇到問題也可以在正則表達必知必會這本書上查閱。順便說一下,在公眾號回復 正則表達式必知必會 即可獲取百度網盤下載連結。
推薦閱讀:
➤R語言怎麼給中文分詞
➤Rwordseg包如何加載本地詞典