一串字符中提取英文?
文本信息: “Ta说群众笑脸smile是最好的扶贫成绩单1234”,按照以往的思路是知道英文字符在文本中的起始位置与终止位置,再根据位置提取出来。当数据量小的时候,这种思路操作是没什么毛病的,但是,当数据量大时,显然这种方法又土又麻烦。
当使用正则表达式时,这个问题好解决多了。采用ringr 包中的 str_extract_all 函数对字符对象x按照“[A-z]”抽取规则进行抽取,最终将字符中的所有大小写英文都提取出来了。
> library(stringr)
> x<-' Ta说群众笑脸smile是最好的扶贫成绩单1234 '
> str_extract_all(x,'[A-z]') [[1]]
[1] "T" "a" "s" "m" "i" "l" "e"
正则表达式还可以处理更复杂的字符形式,比如匹配电子邮箱格式。
> eg<-c('abc@sina.com','add@piilgu','lxl@163.cn','9157@qq.com')
> pattern<-'[A-z0-9]+@[A-z0-9]+\\.(com|cn)'
> gsub(pattern,'*',eg)
[1] "*" "add@piilgu" "*" "*"
pattern正则表达式含义为:大小写字母或数字(一个或多个)@大小写字符与数字(一个或多个).com 或 cn 。
1、匹配数字
> x<-' Ta说群众笑脸smile是最好的扶贫成绩单1234 '
> gsub('[0-9]','*',x)
[1] " Ta说群众笑脸smile是最好的扶贫成绩单**** "
2、匹配英文
[A-z]”匹配大小写英文,“[A-Z]”匹配大写英文,“[a-z]”匹配小写英文
> x<-' Ta说群众笑脸smile是最好的扶贫成绩单1234 '
> gsub('[a-z]','*',x)
[1] " T*说群众笑脸*****是最好的扶贫成绩单1234 "
3、匹配汉字
“[\u4E00-\u9FA5]”机械匹配汉字
> x<-' Ta说群众笑脸smile是最好的扶贫成绩单1234 '
> gsub('[\u4E00-\u9FA5]','*',x)
[1] " Ta*****smile*********1234 "
4、多条件匹配
> x<-' Ta说群众笑脸smile是最好的扶贫成绩单1234 '
> gsub('[A-Z0-9\u4E00-\u9FA5]','*',x)
[1] " *a*****smile************* "
5、轮流匹配
使用|代表或条件
> x<-' Ta说群众笑脸smile是最好的扶贫成绩单1234 '
> gsub('([a-z]|[0-9]|[\u4E00-\u9FA5])','*',x)
[1] " T************************ "
6、“非”的使用
以“^”符号表示“非”
> x<-' Ta说群众笑脸smile是最好的扶贫成绩单1234 '
> gsub('[^\u4E00-\u9FA5]','*',x)
[1] "***说群众笑脸*****是最好的扶贫成绩单*****"
7、寻找字符串模式
匹配带有任意数字(部分匹配)的字符串
> y<-c("Abu", "a123", "1346", "5")
> grep("\\d", y)
[1] 2 3 4
\\d包含"^"和"$", 匹配只有一个数字的字符串
> y<-c("Abu", "a123", "1346", "5")
> grep("^\\d$", y)
[1] 4
那么如何使用分组提取数据并自定义读取数据呢?