R语言| 学一点stringr与正则表达式

Posted R语言与SPSS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R语言| 学一点stringr与正则表达式相关的知识,希望对你有一定的参考价值。

 
   
   
 
  1. ###########  基于R语言的自动收集

  2. ##### 正则表达式和基本字符串函数

  3. library(tidyverse)

 
   
   
 
  1. ## -- Attaching packages ---------------------------------- tidyverse 1.2.1 --

 
   
   
 
  1. ## √ ggplot2 2.2.1     √ purrr   0.2.4

  2. ## √ tibble  1.4.2     √ dplyr   0.7.4

  3. ## √ tidyr   0.7.2     √ stringr 1.2.0

  4. ## √ readr   1.1.1     √ forcats 0.2.0

 
   
   
 
  1. ## -- Conflicts ------------------------------------- tidyverse_conflicts() --

  2. ## x dplyr::filter() masks stats::filter()

  3. ## x dplyr::lag()    masks stats::lag()

 
   
   
 
  1. raw.data <- "555-1234Moe Szyslak(636) 555-0113Burns,C. Montgomery555-6542Rev.Timothy Lovejoy555 8904Ned Flanders 636-555-3226Simpson,Homer5553642 DR. Julius Hibbert "

  2. #选出人名,用[:alpha:],表示a-z和A-Z,即大小写字母

  3. #只选字母

  4. #str_extract_all提取的是列表形式,我们用unlist转为向量,适合在实际问题中单变量的提取

  5. unlist(str_extract_all(raw.data,"[:alpha:]"))

 
   
   
 
  1. ##  [1] "M" "o" "e" "S" "z" "y" "s" "l" "a" "k" "B" "u" "r" "n" "s" "C" "M"

  2. ## [18] "o" "n" "t" "g" "o" "m" "e" "r" "y" "R" "e" "v" "T" "i" "m" "o" "t"

  3. ## [35] "h" "y" "L" "o" "v" "e" "j" "o" "y" "N" "e" "d" "F" "l" "a" "n" "d"

  4. ## [52] "e" "r" "s" "S" "i" "m" "p" "s" "o" "n" "H" "o" "m" "e" "r" "D" "R"

  5. ## [69] "J" "u" "l" "i" "u" "s" "H" "i" "b" "b" "e" "r" "t"

 
   
   
 
  1. #选择人名,用*的效果,*表示{0,},将非目标字符视为空值,但是也匹配出来

  2. #结果是将数字字符视为空值,匹配出来了

  3. unlist(str_extract_all(raw.data,"[:alpha:]*"))

 
   
   
 
  1. ##  [1] ""           ""           ""           ""           ""          

  2. ##  [6] ""           ""           ""           "Moe"        ""          

  3. ## [11] "Szyslak"    ""           ""           ""           ""          

  4. ## [16] ""           ""           ""           ""           ""          

  5. ## [21] ""           ""           ""           ""           ""          

  6. ## [26] "Burns"      ""           "C"          ""           ""          

  7. ## [31] "Montgomery" ""           ""           ""           ""          

  8. ## [36] ""           ""           ""           ""           "Rev"      

  9. ## [41] ""           "Timothy"    ""           "Lovejoy"    ""          

  10. ## [46] ""           ""           ""           ""           ""          

  11. ## [51] ""           ""           "Ned"        ""           "Flanders"  

  12. ## [56] ""           ""           ""           ""           ""          

  13. ## [61] ""           ""           ""           ""           ""          

  14. ## [66] ""           ""           ""           "Simpson"    ""          

  15. ## [71] "Homer"      ""           ""           ""           ""          

  16. ## [76] ""           ""           ""           ""           "DR"        

  17. ## [81] ""           ""           "Julius"     ""           "Hibbert"  

  18. ## [86] ""           ""

 
   
   
 
  1. #用+号,+表示{1,0},即只选择目标字符

  2. #结果中没有数字字符的空值,成功提取了所有的单词,但是逻辑上没有连在一起

  3. unlist(str_extract_all(raw.data,"[:alpha:]+"))

 
   
   
 
  1. ##  [1] "Moe"        "Szyslak"    "Burns"      "C"          "Montgomery"

  2. ##  [6] "Rev"        "Timothy"    "Lovejoy"    "Ned"        "Flanders"  

  3. ## [11] "Simpson"    "Homer"      "DR"         "Julius"     "Hibbert"

 
   
   
 
  1. #为什么没有连在一起呢?因为名字的中间有空格!

  2. #加入空格,我用的是空格键打出来的,也可以用\s

  3. #同时注意,我们匹配的内容是 字母加空格,所以就需要有两个[],不能在[:alpha:]直接加入

  4. unlist(str_extract_all(raw.data,"[[:alpha:] ]+"))

 
   
   
 
  1. ##  [1] "Moe Szyslak"      " "                "Burns"          

  2. ##  [4] "C"                " Montgomery"      "Rev"            

  3. ##  [7] "Timothy Lovejoy"  " "                "Ned Flanders "  

  4. ## [10] "Simpson"          "Homer"            " DR"            

  5. ## [13] " Julius Hibbert "

 
   
   
 
  1. #在用到\s代表空格的时候,就遇到了转义字符的问题

  2. #简单明说,就是在R中,必须类似\s和\d的前面,再加上一个\,组成\\s才能准确表达空格这个含义,否则R不认识,就会error

  3. unlist(str_extract_all(raw.data,"[[:alpha:]\\s]+"))

 
   
   
 
  1. ##  [1] "Moe Szyslak"      " "                "Burns"          

  2. ##  [4] "C"                " Montgomery"      "Rev"            

  3. ##  [7] "Timothy Lovejoy"  " "                "Ned Flanders "  

  4. ## [10] "Simpson"          "Homer"            " DR"            

  5. ## [13] " Julius Hibbert "

 
   
   
 
  1. #这次的结果,我们发现Moe Szyslak 和Timothy Lovejoy的结果是我们想要的,但是其他的还没达到我们想要的结果,问题在哪?

  2. #因为我们发现有的名字,如Burns,C. Montgomery中,既有,号也有.号,观察一下,的确是因为这两个符号导致了分割

  3. #所以,我们下一步的思路是 将,号和.号,一起和空格加入到内容的匹配中

  4. unlist(str_extract_all(raw.data,"[[:alpha:]\\s,.]+"))

 
   
   
 
  1. ## [1] "Moe Szyslak"          " "                    "Burns,C. Montgomery"

  2. ## [4] "Rev.Timothy Lovejoy"  " "                    "Ned Flanders "      

  3. ## [7] "Simpson,Homer"        " DR. Julius Hibbert "

 
   
   
 
  1. #结果中的内容是我们想要的,但是为什么会有空值出现呢?

  2. #检查文本 555-1234Moe Szyslak(636) 555-0113Burns,C. Montgomery,我们发现在(636)和555之间有一个空格

  3. #将原文本的空格删掉

  4. raw.data2 <- "555-1234Moe Szyslak(636)555-0113Burns,C. Montgomery555-6542Rev.Timothy Lovejoy555 8904Ned Flanders 636-555-3226Simpson,Homer5553642 DR. Julius Hibbert "

  5. unlist(str_extract_all(raw.data2,"[[:alpha:]\\s,.]+"))

 
   
   
 
  1. ## [1] "Moe Szyslak"          "Burns,C. Montgomery"  "Rev.Timothy Lovejoy"

  2. ## [4] " "                    "Ned Flanders "        "Simpson,Homer"      

  3. ## [7] " DR. Julius Hibbert "

 
   
   
 
  1. #我们就明显发现原来结果中的第二个空值没有了,但实际出来问题中这样做是不行的,要改进一下正则的写法,或者按照字符数排除

  2. #有空格,感觉是因为匹配的内容里有,但是怎么限制空格呢?

  3. #将+改为{2,}

  4. unlist(str_extract_all(raw.data,"[[:alpha:]. ,]{2,}"))

 
   
   
 
  1. ## [1] "Moe Szyslak"          "Burns,C. Montgomery"  "Rev.Timothy Lovejoy"

  2. ## [4] "Ned Flanders "        "Simpson,Homer"        " DR. Julius Hibbert "

 
   
   
 
  1. #或者在原来的基础上用nchar函数做消除

  2. name <- unlist(str_extract_all(raw.data2,"[[:alpha:]\\s,.]+"))

  3. name

 
   
   
 
  1. ## [1] "Moe Szyslak"          "Burns,C. Montgomery"  "Rev.Timothy Lovejoy"

  2. ## [4] " "                    "Ned Flanders "        "Simpson,Homer"      

  3. ## [7] " DR. Julius Hibbert "

 
   
   
 
  1. name[nchar(name)>2]

 
   
   
 
  1. ## [1] "Moe Szyslak"          "Burns,C. Montgomery"  "Rev.Timothy Lovejoy"

  2. ## [4] "Ned Flanders "        "Simpson,Homer"        " DR. Julius Hibbert "

以上是关于R语言| 学一点stringr与正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

R语言--字符处理(stringr包)

R stringr 正则表达式提取括号内的字符

R语言 正则表达式

将正则表达式应用于 R 中的字符串

R语言中如何提取字符串

使用正则表达式提取字符串 - str_extract、stringr、regex