R語言之正則表達式

在我看來,正則表達式的主要用途有兩種:①查找特定的信息②查找並編輯特定的信息,也就是咱們常常用的替換。。好比咱們要在Word,記事本等裏面使用快捷鍵Ctrl+F,進行查找一個特定的字符,或者替換一個字符,這就使用了正則表達式。python

  正則表達式的功能很是強大,尤爲是在文本數據進行處理中顯得更加突出。R中的grep、grepl、sub、gsub、regexpr、gregexpr等函數都使用正則表達式的規則進行匹配。這幾個函數原型以下:git

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)  

  

這裏是對參數進行一個解釋說明。正則表達式

 

參數windows

說明函數

pattern編碼

正則表達式spa

x, text.net

字符向量或字符對象,在R 3.0.0後版本中,最大支持超過2^31個的字符元素。code

ignore.caseregexp

默認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)。

 

 

     下面是我對正則表達式轉義字符的一些總結,但R語言裏面grep、grepl、sub、gsub、regexpr、gregexpr這幾個函數並不支持使用 「\」 進行轉義。

 

正則表達式轉義字符
空白元字符 [\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語言》回覆 正則表達式必知必會 便可獲取下載連接。

 

轉載請註明原文csdn連接:http://blog.csdn.NET/wzgl__wh/article/details/52938475

相關文章
相關標籤/搜索