R語(yǔ)言基礎(chǔ)系列:
- R語(yǔ)言基礎(chǔ)1--R數(shù)據(jù)格式:.rds和.rda的區(qū)別
- R語(yǔ)言基礎(chǔ)2--數(shù)據(jù)排序與長(zhǎng)寬型數(shù)據(jù)的轉(zhuǎn)換
- R語(yǔ)言基礎(chǔ)3--tidyverse包總結(jié)
- R語(yǔ)言基礎(chǔ)4--dplyr包的函數(shù)及用法
- R語(yǔ)言基礎(chǔ)5--tidyr包的函數(shù)及用法
- R語(yǔ)言基礎(chǔ)6--apply函數(shù)家族及其應(yīng)用
定義:正則表達(dá)式是對(duì)字符串[包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為"元字符")]操作的一種邏輯公式,就是用事先定義好的一些特定字符及這些特定字符的組合,組成一個(gè)"規(guī)則字符串",這個(gè)"規(guī)則字符串"用來(lái)表達(dá)對(duì)字符串的一種過(guò)濾邏輯。正則表達(dá)式是一種文本模式,該模式描述在搜索文本時(shí)要匹配的一個(gè)或多個(gè)字符串。
目的:給定一個(gè)正則表達(dá)式和另一個(gè)字符串,我們可以達(dá)到如下的目的
1. 給定的字符串是否符合正則表達(dá)式的過(guò)濾邏輯(稱作"匹配"):
2. 可以通過(guò)正則表達(dá)式,從字符串中獲取我們想要的特定部分。特點(diǎn)
1. 靈活性、邏輯性和功能性非常強(qiáng);
2. 可以迅速地用極簡(jiǎn)單的方式達(dá)到字符串的復(fù)雜控制。
3. 由于正則表達(dá)式主要應(yīng)用對(duì)象是文本,因此它在各種文本編輯器場(chǎng)合都有應(yīng)用,小到著名編輯器EditPlus,大到Microsoft Word、Visual Studio等大型編輯器,都可以使用正則表達(dá)式來(lái)處理文本內(nèi)容。
??R中的
grep
、grepl
、sub
、gsub
、regexpr
、gregexpr
等函數(shù)都使用正則表達(dá)式的規(guī)則進(jìn)行匹配。
這些函數(shù)的用法見(jiàn):字符串的處理
1. 原義表達(dá)式
mystring1 <- c('apple','orange')
grep('p',mystring1)
# [1] 1
p匹配的是它自己,這就是原義表達(dá)式。
2. 轉(zhuǎn)義表達(dá)式(它在正則表達(dá)式中代表的不是它自己,而是有別的含義)
2.1:. 表示除了換行符以外的任一字符
mystring2 <- c('huihui','.dfs','-lhr')
grep('.',mystring2)
# [1] 1 2 3
sub("a.c","",c("abcd","sdacd"))
[1] "d" "sdacd"
本來(lái)只想匹配 . ,但是在這里這個(gè)點(diǎn)代表了所有字符,于是返回了1 2 3。這個(gè). 就是一個(gè)轉(zhuǎn)義表達(dá)式。
2.2: [ ]
mystring3 <- c('33l','.jz19','hal6')
grep('[7:9]',mystring3)
# [1] 2
grep('[3-4]',mystring3)
# [1] 1
sub("[1-9]","",c("ab001","001ab"))
[1] "ab00" "00ab"
分別提取含7-9的數(shù)字或3-4的數(shù)字的字符串
2.3: ^ 匹配一個(gè)字符串的開始
^XX就是以XX開頭的意思
mystring4 <- c('Alice','apple','abandon','Hayley','application')
grep('^ap',mystring4)
# [1] 2 5
sub("^a","",c("abcd","dcba"))
[1] "bcd" "dcba"
當(dāng)^放在方括號(hào)內(nèi)是取非的意思
grep('[^7-9]',mystring3)
# [1] 1 2 3
2.4: { } 表示重復(fù)幾次的作用
mystring5 <- c('1220','2289','2228','10002')
grep('2{2,3}',mystring5)
# [1] 1 2 3
2{2,3}是尋找2倍重復(fù)了2到3次的意思
2{2,}是尋找2倍重復(fù)了大于2次(2到+無(wú)窮)的意思
2.5: + 匹配1或多個(gè)正好在它之前的那個(gè)字符
mystring6 <- c('food','foot','for','fans')
grep('fo+',mystring6)
# [1] 1 2 3
grep('fo{1,}',mystring6)
# [1] 1 2 3
fo+表示+緊跟著的o可以被重復(fù)1次或1次以上
大括號(hào)也可以起到這樣的作用
若想讓緊跟在o后面的對(duì)fo都起作用,需要小括號(hào)
grep('(fo){1,}',mystring6)
# [1] 1 2 3
2.6: * 表示將其前的字符進(jìn)行0個(gè)或多個(gè)的匹配
與+用法一致。+表示重復(fù)了1次或1次以上,*表示0次或0次以上。
.* 可以匹配任意字符
2.7: 管道符| 表示邏輯的或
mystring7 <- c('kobe','messi','meymar')
grep('^k|^m',mystring7)
# [1] 1 2 3
管道符連接前后,符合其一即會(huì)被返回
2.8: $ 匹配字符串的結(jié)尾
mystring8 <- c('active','positive','negative','intension')
grep('ive$',mystring8)
# [1] 1 2 3
sub("a$","",c("abcd","dcba"))
[1] "abcd" "dcb"
\\b也可以起到一樣的作用,但\\b更靈活,既可以放開頭也可以放結(jié)尾。(\\b主要是匹配邊界)
2.9: ? 匹配0或1個(gè)正好在它之前的那個(gè)字符
- 匹配任意多個(gè)字符(0-正無(wú)窮個(gè))
?匹配任意單個(gè)字符(1個(gè))
3. 保義字符: \
mystring9 <- c('active','pos^itive','negative','^intension')
grep('\^',mystring9)
# Error: '\^' is an unrecognized escape in character string starting "'\^"
grep('\\^',mystring9)
# [1] 2 4
\的作用就是說(shuō)明^不是開頭的意思,是要去匹配這個(gè)符號(hào)
對(duì)所有的轉(zhuǎn)義符號(hào)都適用
4. 正則表達(dá)式中的特殊字符
特殊字符 | 匹配內(nèi)容 |
---|---|
\\b | 匹配字符邊界 |
\\B | 匹配字符非邊界 |
\\d | 匹配數(shù)字0-9,等價(jià)于[0:9] |
\\D | 等價(jià)于[^0:9] 取非0-9 |
\\s | 匹配空白的字符,包括空格、換行符等 |
\\S | 匹配非空字符 |
\\w | 匹配字母和數(shù)字(a-z A-Z 0-9..) |
\\W | 匹配非字母和數(shù)字 |
\\ < | 匹配以空白字符開始的字符 |
\\ > | 匹配以空白字符結(jié)束的字符 |
mystring10 <- c('2013','abcd','13sg')
grep('\\d',mystring10)
# [1] 1 3
grep('\\D',mystring10)
# [1] 2 3
mystring11 <- c('',' abcd','13 sg','apple')
grep('\\S',mystring11)
# [1] 2 3 4 空格也是一種空白,所以2和3也被返回了
mystring12 <- c('theory','the republic','they')
grep('\\<the\\>',mystring12)
#[1] 2
mystring13 <- c('theory','the republic',' the')
#[1] 2 3