今天学习了R语言相关的视频医学R语言快速入门与数据清洗第24-25讲,通过stringr和stringi学习正则表达式,这个作者先讲了正则表达式的的一些常用转义保义符号。
##转义字符
#1 对字符串的操作,可以是本义操作可以是转义操作:白话就是字母或字符本身或替代的东西
mystring1 <- c('apple','orange')
grep('p', mystring1)
#2 第1个正则表达式常用符号".":指代所有字符和字母跟Linux里面的*通配符类似
mystring2 <- c('shuda','.dfs','-dsfd')
grep('.',mystring2)
#3 第2个正则表达式常用符号"[]"这个是限定位置的跟R基础里面的取子集类似,返回的是逻辑值,另外像"."等元字符就的识别可以用这个中括号括起来。
mystring3 <- c('9anv','fss7','1000','ss7')
grep('[0-1]',mystring3)
#4 第3个正则表达式常用符号"^":这个是匹配以^符号后的字符开头的元素。
mystring4 <- c('apple','application','abb')
grep('^ap', mystring4)
mystring3 <- c('9anv','fss7','5000','ss7')
#当和"[]"联合用的时候就表示匹配非^符号后的字符开头的元素。
grep('[^0-1]',mystring3)
#5 第4个正则表达式常用符号"{}":返回匹配括号前的字符限定括号里面的范围内的元素,听起来拗口通过例子就很好理解了。
mystring6 <- c('1220','2289','2228','10002')
grep('2{2,}',mystring6)
#6 第5个正则表达式常用符号"+":这个有点像Linux里面的?这个通配符所指代的意思指匹配内容1次以上
mystring7 <- c('food','foot','foul','fans')
grep('fo+',mystring7)
grep('fo{1,}',mystring7)
#由于{}限定的只是它前面一个字符,如果需要用多个字符,需要在前面用()括起来
grep('(fo){1,}',mystring7)
#7 第6个正则表达式常用符号"*":这个跟+差不多,所指代的意思指匹配内容0次以上
#8 第7个正则表达式常用符号"|":这个不是Linux里面的管道符,这是或者的意思,在向量取子集的时候我们也用到过
mystring8 <- c('kobe','messi','neymar')
#指取以k,或者以m开头的元素
grep('^k|^m',mystring8)
#9 第8个正则表达式常用符号"$":是匹配以$符号前的字符结尾的元素,和\\b的用法差不多,但是没有\\b扩展性。
mystring9 <- c('active','positive','neagtive','iention')
grep('ive$', mystring9)
grep('ive\\b', mystring9)
##保义字符:除了用[],也可以用\\来
#下面是一些字母指代的内容和上面的字符结合的效果
mysting10 <- c('ac^bb','^df')
grep('\\^', mysting10)
##正则表达式的特殊字符
#\\d = [0-9] 表示匹配数值0-9
#\\D = [^0-9]表示匹配非数值0-9
#\\s 表示匹配空格制表符等
#\\S 表示匹配非空字符
#\\w =[a-zA-Z0-9] 表示匹配字符数字、字母等
#\\W = [^a-zA-Z0-9] 表示匹配非字符数字、字母等
#\\b 表示匹配字符边界
#\\B 表示匹配字符非边界
#\\< 表示匹配以空白字符开始的文本
#\\> 表示匹配以空白字符结束的文本
mystring11 <- c('2013','abcd','13sg')
grep('\\D', mystring11)
mystring12 <- c('', ' able', ' moth er','happy')
grep('\\S', mystring12)
mystrinf13 <- c('theory', 'the republic', ' the ')
grep('\\<the\\>',mystrinf13)
如果掌握了这些符号配合stringr或stringi这两个包的函数,基本上字符串的处理就没有问题了,讲者是这么说的。
下面就是配合2个包的使用实例,还是非常有用的:
#install.packages('stringr')
library(stringr)
str_c('a','b',sep = '-')
#str_length(),nchar()这两个函数结果类似
#substr(),基础替换函数
yxf <- 'yi xue fang'
str_sub(yxf, c(1,4,8), c(2,6,11))
#替换
str_sub(yxf, 1,1) <- 'Y'
#重复,类似rep()
fruit <- c("apple", "pear", "banana")
str_dup(fruit, 2)
#对重复的次数可以用一个向量
str_dup(fruit, 2:4)
string <- ' Eternal love for YanQ '
#去除字符串首尾的空格这里的side参数还可以设置为left,right分别去除一边。
str_trim(string, side = 'both')
phones <- c(" 219 733 8965", "329-293-8753 ", "banana", "595 794 7569",
"387 287 6718", "apple", "233.398.9187 ", "482 952 3315",
"239 923 8115 and 842 566 4692", "Work: 579-499-7527", "$1000",
"Home: 543.355.3679")
#用正则表达式提取手机号码
str_extract(phones, "([2-9][0-9]{2})[- .]([0-9]{3})[- .]([0-9]{4})")
#这个正则表达式提取电话号码分5个字段来取:3位数+连接符+3位数+链接符+四位数,第一个小括号的内容匹配前3位数,第一个数字2-9取值,第2,3位0-9取值然后取2个数大括号数字提示重复取2次的意思,后面跟一个中括号是连接符可以是-空格和.后面的参照这个。
fruits <- c("one apple", "two pears", "three bananas")
#用正则表达式替换匹配到的第一个字符
str_replace(fruits, "[aeiou]", "-")
#用正则表达式替换匹配到的所有字符
str_replace_all(fruits, "[aeiou]", "-")
#install.packages("stringi")
library(stringi)
#这个函数类似past0,但是参数设定结果不太一样
stri_join(1:7, letters[1:7], sep='-')
stri_join(1:7, letters[1:7], collapse='-')
#stri_cmp_eq() & stri_cmp_neq()一对函数作用相反,比较是否一样
stri_cmp_neq('AB','aB')
#stri_cmp_lt() & stri_cmp_gt(),lt小于,gt大于,比较字符串:数字大小,字母按排序比较
stri_cmp_gt('a121','b221')
#计数函数
language <- c('Python','R', 'PHP', 'Ruby', 'Java',
'JavaScript', 'C', 'Oracle', 'C++', 'C#', 'Spark', 'Go',
'Room', 'Good', 'Pathon', 'ScriptJava', 'R2R', 'C+','C*')
#根据正则表达式匹配参数是regex=
stri_count(language, fixed = 'R')
stri_count(language, regex = '^J')
test <- 'Theu00a0above-mentioned features are very useful.
Warm thanks to their developers. Tomorrow is a, new$% day###'
#根据字符相关内容计数字符串
stri_count_boundaries(test, type="word")
stri_count_boundaries(test, type="sentence")
stri_count_boundaries(test, type="character")
#重复类似于rep()
stri_dup(c("abc", "pqrst"), c(4, 2))
#判断字符串否有重复
stri_duplicated(c("a", "b", "a", NA, "a", NA))
stri_duplicated(c("a", "b", "a", NA, "a", NA), fromLast=TRUE)
stri_duplicated_any(c("a", "b", "a", NA, "a", NA))
#用regex正则表达式参数来寻找
stri_detect_fixed(c("stringi R", "REXAMINE", "123"), c('i', 'R', '0'))
stri_detect_regex(c("above", "abort", "about", "abnormal", 'abandon'), '^ab')
stri_detect_regex(c("above", "abort", "about", "abnormal", 'abandon'), 't\\b')
#case_insensitive 是否忽略大小写,类似ignore case
stri_detect_regex(c('ABOUT','abort','AboVE'), '^ab', case_insensitive = TRUE)
#判断是否是以某些某个字符开头的,from参数从某个数值位置开始
stri_startswith_fixed(c("a1", "a2", "b3", "a4", "c5"), "a")
stri_startswith_fixed(c("a1", "a2", "b3", "a4", "c5"), "a1")
stri_startswith_fixed(c("abaDc", "aabadc",'ababa'), "ba", from=2)
#判断是否是以某些某个字符结尾的,to参数从某个数值位置结束
stri_endswith_fixed(c("abaDc", "aabadc",'ababa'),'ba')
stri_endswith_fixed(c("abaDc", "aabadc",'ababa'),'ba', to = 3)
#提取字符
tEmp_text <- c('EU_FRA02_C1_S2008','AF_COM12_B0_2004','AF_COM17_F0_S2008',
'AS_CHN11_C3_2004','EU-FRA-C3-S2007','NAUSA02E02005',
'AS_CHN12_N0_05','NA_USA03_C2_S2007','NA USA04_A3 2004',
'EU_UK01_A0_2009','eu_fra_a2_s98', 'SA_BRA08_B0_1996')
#Generate a strings composed by several sequence names.
#提取序列信息的年份包括4位数2位数的年份信息用正则表达式regex = '[0-9]{2,4}\\b'
stri_extract_all(tEmp_text, regex = '[0-9]{2,4}\\b')
#忽略大小写case_insensitive=TRUE,_fixed不用正则表达式跟上面的意思差不多
stri_extract_all_fixed("abaBAba", "Aba", case_insensitive=TRUE, overlap=TRUE)
#提取字符串的边界_boundaries,空格是边界也被提取出来了
stri_extract_all_boundaries("stringi: THE string processing package 123.48...")
stri_extract_all_words("stringi: THE string processing package 123.48...")
#判断是否字符串向量中是否有空字符
stri_isempty(c(',', '', 'abc', '123', 'u0105u0104',' '))
#定位函数
stri_locate_all('I want to learn R to promote my statistical skills', fixed='to')
需要强调的是
str_extract(phones, "([2-9][0-9]{2})[- .]([0-9]{3})[- .]([0-9]{4})")
- 这个正则表达式提取电话号码分5个字段来取:3位数+连接符+3位数+链接符+四位数,第一个小括号的内容匹配前3位数,第一个数字2-9取值,第2,3位0-9取值然后取2个数大括号数字提示重复取2次的意思,后面跟一个中括号是连接符可以是
-空格和.
后面的参照前面解释。
stringi包基本是和stringr包作用一样,但是它更多依赖正则表达式,注意着几个参数regex=
,case_insensitive=
其实关于这个包的说明书有100多页,完整的掌握可能需要花不少的时间,后续需要进一步探索。
参考资料:
https://www.rdocumentation.org/packages/stringr
https://cran.r-project.org/web/packages/stringi/stringi.pdf