在我看來,正規表示式的主要用途有兩種:①查詢特定的資訊②查詢並編輯特定的資訊,也就是我們經常用的替換。。比如我們要在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)。
下面是我對正規表示式轉義字元的一些總結,但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,否則都不匹配
匹配零個或任意多個字元或字元集合,也可以沒有匹配
匹配乙個或多個字元,至少匹配一次
匹配零個或乙個字元
現在來舉幾個例子。
首先使用中括號的功能,來查詢一下看有沒有do組合的單詞。
text
"and","believe","in","and","it","will","come","naturally")
#查詢含有do組合的單詞
grep("[dd]o",text)#不區分大小寫
grep("[d]o",text)#d要大寫
grep("[d]o",text)#d小寫
執行結果如下:
> text
+ "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
grepl("[0-9.*]+@[a-z.*].[a-z.*]",text2)
> text2
> grepl("[0-9.*]+@[a-z.*].[a-z.*]",text2)
[1] true
可以已經查詢郵箱的。
R語言之for迴圈
程式示例 資料集 id t1 t2 t3 1 1 52.56441 10.074323 18.81786 2 1 50.18791 10.058374 18.30228 3 1 47.68246 10.476636 21.96603 4 1 48.52158 10.005308 20.05809 5...
R語言之正規表示式
常見與正規表示式相關的函式 grep pattern,x,ignore.case false,perl false,value false,fixed false,usebytes false,invert false grepl pattern,x,ignore.case false,perl f...
R語言之正規表示式
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 fal...