R语言基础系列:
- R语言基础1--R数据格式:.rds和.rda的区别
- R语言基础2--数据排序与长宽型数据的转换
- R语言基础3--tidyverse包总结
- R语言基础4--dplyr包的函数及用法
- R语言基础5--tidyr包的函数及用法
- R语言基础6--apply函数家族及其应用
定义:正则表达式是对字符串[包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")]操作的一种逻辑公式,就是用事先定义好的一些特定字符及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。
目的:给定一个正则表达式和另一个字符串,我们可以达到如下的目的
1. 给定的字符串是否符合正则表达式的过滤逻辑(称作"匹配"):
2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。特点
1. 灵活性、逻辑性和功能性非常强;
2. 可以迅速地用极简单的方式达到字符串的复杂控制。
3. 由于正则表达式主要应用对象是文本,因此它在各种文本编辑器场合都有应用,小到著名编辑器EditPlus,大到Microsoft Word、Visual Studio等大型编辑器,都可以使用正则表达式来处理文本内容。
⚠️R中的
grep
、grepl
、sub
、gsub
、regexpr
、gregexpr
等函数都使用正则表达式的规则进行匹配。
这些函数的用法见:字符串的处理
1. 原义表达式
mystring1 <- c('apple','orange')
grep('p',mystring1)
# [1] 1
p匹配的是它自己,这就是原义表达式。
2. 转义表达式(它在正则表达式中代表的不是它自己,而是有别的含义)
2.1:. 表示除了换行符以外的任一字符
mystring2 <- c('huihui','.dfs','-lhr')
grep('.',mystring2)
# [1] 1 2 3
sub("a.c","",c("abcd","sdacd"))
[1] "d" "sdacd"
本来只想匹配 . ,但是在这里这个点代表了所有字符,于是返回了1 2 3。这个. 就是一个转义表达式。
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的数字或3-4的数字的字符串
2.3: ^ 匹配一个字符串的开始
^XX就是以XX开头的意思
mystring4 <- c('Alice','apple','abandon','Hayley','application')
grep('^ap',mystring4)
# [1] 2 5
sub("^a","",c("abcd","dcba"))
[1] "bcd" "dcba"
当^放在方括号内是取非的意思
grep('[^7-9]',mystring3)
# [1] 1 2 3
2.4: { } 表示重复几次的作用
mystring5 <- c('1220','2289','2228','10002')
grep('2{2,3}',mystring5)
# [1] 1 2 3
2{2,3}是寻找2倍重复了2到3次的意思
2{2,}是寻找2倍重复了大于2次(2到+无穷)的意思
2.5: + 匹配1或多个正好在它之前的那个字符
mystring6 <- c('food','foot','for','fans')
grep('fo+',mystring6)
# [1] 1 2 3
grep('fo{1,}',mystring6)
# [1] 1 2 3
fo+表示+紧跟着的o可以被重复1次或1次以上
大括号也可以起到这样的作用
若想让紧跟在o后面的对fo都起作用,需要小括号
grep('(fo){1,}',mystring6)
# [1] 1 2 3
2.6: * 表示将其前的字符进行0个或多个的匹配
与+用法一致。+表示重复了1次或1次以上,*表示0次或0次以上。
.* 可以匹配任意字符
2.7: 管道符| 表示逻辑的或
mystring7 <- c('kobe','messi','meymar')
grep('^k|^m',mystring7)
# [1] 1 2 3
管道符连接前后,符合其一即会被返回
2.8: $ 匹配字符串的结尾
mystring8 <- c('active','positive','negative','intension')
grep('ive$',mystring8)
# [1] 1 2 3
sub("a$","",c("abcd","dcba"))
[1] "abcd" "dcb"
\\b也可以起到一样的作用,但\\b更灵活,既可以放开头也可以放结尾。(\\b主要是匹配边界)
2.9: ? 匹配0或1个正好在它之前的那个字符
- 匹配任意多个字符(0-正无穷个)
?匹配任意单个字符(1个)
3. 保义字符: \
mystring9 <- c('active','pos^itive','negative','^intension')
grep('\^',mystring9)
# Error: '\^' is an unrecognized escape in character string starting "'\^"
grep('\\^',mystring9)
# [1] 2 4
\的作用就是说明^不是开头的意思,是要去匹配这个符号
对所有的转义符号都适用
4. 正则表达式中的特殊字符
特殊字符 | 匹配内容 |
---|---|
\\b | 匹配字符边界 |
\\B | 匹配字符非边界 |
\\d | 匹配数字0-9,等价于[0:9] |
\\D | 等价于[^0:9] 取非0-9 |
\\s | 匹配空白的字符,包括空格、换行符等 |
\\S | 匹配非空字符 |
\\w | 匹配字母和数字(a-z A-Z 0-9..) |
\\W | 匹配非字母和数字 |
\\ < | 匹配以空白字符开始的字符 |
\\ > | 匹配以空白字符结束的字符 |
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