学会这三个包,搞定R中的正则

简介: 天下苦正则久矣,尤其当字符串中有自己想要的一段数据时候苦苦提取不出来的感觉真是难受,今天给大家介绍3个R包来解决这种正则带来烦恼的包,希望对大家能有所帮助。

regexplain

RegExplain是一个RStudio插件,用于正则表达式。以交互方式构建regexp、检查常用字符串匹配函数的输出、查阅交互式帮助页面或使用包含的资源学习正则表达式。

github地址:https://github.com/gadenbuie/regexplain

安装

# install.packages("remotes")
remotes::install_github("gadenbuie/regexplain")

安装完成后,Addins处会多出一些插件,其中常用的就是RegExplain SelectionRegExplain File功能,即可以将文本导入RegExplain的两种方法。

在RStudio窗口中中选择对象名称或文本行或代码行,然后运行RegExplain Selection即可。

要从文件中导入文本,请使用RegExplain file来导入要用正则表达式处理的文本。在导入文本时,RegExplain自动将文本缩减为唯一的条目,并限制行数。

399dba845932d5feca7d3fef1b41d45.png

另外也有CheetSheet辅助我们查看基本正则的写法。

deaefea33e01df76fe8aea2cbb1d091.png

RegExplain也提供了函数view_regex,您可以使用它作为字符串::str_view()的替换。除了突出显示文本中匹配的部分之外,view_regex()还会为组着色,并尝试为regex表达式本身着色。

text <- c("breakfast=eggs;lunch=pizza",
          "breakfast=bacon;lunch=spaghetti", 
          "no food here")
pattern <- "((\\w+)=)(\\w+).+(ch=s?p)"
view_regex(text, pattern)

b2f12f35d033da1e2ab391666b1cdf6.png

详情查看Github,有较详细的示例..

stringr.plus

github地址:https://github.com/johncassil/stringr.plus

stringr.plus提供了一些stringr中没有的额外函数来处理字符串。函数运行可以很好的与tidyverse搭配。这些函数在处理url和文件路径数据时特别有用,可以从字符串中提取特定的文本。

示例

#install.packages('stringr.plus')
#remotes::install_github("johncassil/stringr.plus")
library(stringr.plus)
url <- 'www.carfax.com/vehicle/3GCPKTE77DG348900'
#仅提取基本的url
str_extract_before(string = url, pattern = '/')
#> [1] "www.carfax.com"
## 提取基础url的后面的部分
str_extract_after(string = url, pattern = '/')
#> [1] "vehicle/3GCPKTE77DG348900"
## 仅提取最后一部分
str_extract_after(string = url, pattern = 'vehicle/')
#> [1] "3GCPKTE77DG348900"
## 提取最后一部分的前5个字母
str_extract_after(string = url, pattern = 'vehicle/', num_char = 5)
#> [1] "3GCPK"
##通过last 和 first(默认) 更方便的指定
str_extract_after(string = url, pattern = '/', which = "last")
#> [1] "3GCPKTE77DG348900"
str_extract_before(string = url, pattern = '/', which = "last")
#> [1] "www.carfax.com/vehicle"
## 提取两个格式之间的文本
file_path <- "C:/Users/pingu/Downloads/a-very-poorly-named-file_08_09_2020.csv"
str_extract_between(string = file_path, pattern1 = '_', pattern2 = ".csv")
#> [1] "08_09_2020"

有时,检测字符串是否包含多个模式是有帮助的,str_detect_multiple通常用于过滤目的,或与且的概念。

############### 且模式#######
#str_detect_multiple with the "and" 方法确保文本中含有多个匹配默认
file_path <- "C:/Users/pingu/Downloads/a-very-poorly-named-file_08_09_2020.csv"
str_detect_multiple(string = file_path, patterns = c("pingu", "2020"), method = 'and')
#> [1] TRUE
#更精简版的模式 str_detect_multiple_and()
str_detect_multiple_and(string = file_path, patterns = c("Downloads", "csv"))
#> [1] TRUE
############### 或模式 #######
#str_detect_multiple with the "and" 方法确保文本中含有多个匹配默认
str_detect_multiple(string = file_path, patterns = c("very", "purple"), method = 'or')
#> [1] TRUE
#It is also aliased with str_detect_multiple_or()
str_detect_multiple_or(string = file_path, patterns = c("large", "file"))
#> [1] TRUE

理解模式匹配的上下文也很重要,str_extract_context可以将模式扩展为给定模式前后的最大字符数

## 使用window_size函数控制字符数
## str_extract_context()返回第一个匹配
sentence <- "I have spread my dreams under your feet; Tread softly because you tread on my dreams."
str_extract_context(string = sentence, pattern = "my", window_size = 15)
#> [1] "I have spread my dreams under y"
##str_extract_context_all() 返回所有的匹配
str_extract_context_all(string = sentence, pattern = "my", window_size = 15)
#>      [,1]                             
#> [1,] "I have spread my dreams under y"
#> [2,] "e you tread on my dreams."

interregex

inferregex的目标是推断识别字符串的正则表达式(regex)以及其他特性,这点还是很智能的。

github地址:https://github.com/daranzolin/inferregex

example1-单字符串

remotes::install_github("daranzolin/inferregex")
library(inferregex)
s <- "abcd-9999-ab9"
infer_regex(s)$regex
#> [1] "^[a-z]{4}-\\d{4}-[a-z]{2}\\d$"

example2-批量多字符串

library(purrr)
(regex_df <- map_dfr(rownames(mtcars), infer_regex))
all(map2_lgl(regex_df$string, regex_df$regex, ~grepl(.y, .x)))
#>                 string                                         regex
#> 1            Mazda RX4                 ^[A-Z][a-z]{4}\\s[A-Z]{2}\\d$
#> 2        Mazda RX4 Wag ^[A-Z][a-z]{4}\\s[A-Z]{2}\\d\\s[A-Z][a-z]{2}$
#> 3           Datsun 710                      ^[A-Z][a-z]{5}\\s\\d{3}$
#> 4       Hornet 4 Drive         ^[A-Z][a-z]{5}\\s\\d\\s[A-Z][a-z]{4}$
#> 5    Hornet Sportabout               ^[A-Z][a-z]{5}\\s[A-Z][a-z]{9}$
#> 6              Valiant                               ^[A-Z][a-z]{6}$
#> 7           Duster 360                      ^[A-Z][a-z]{5}\\s\\d{3}$
#> 8            Merc 240D                 ^[A-Z][a-z]{3}\\s\\d{3}[A-Z]$
#> 9             Merc 230                      ^[A-Z][a-z]{3}\\s\\d{3}$
#> 10            Merc 280                      ^[A-Z][a-z]{3}\\s\\d{3}$
#> 11           Merc 280C                 ^[A-Z][a-z]{3}\\s\\d{3}[A-Z]$
#> 12          Merc 450SE              ^[A-Z][a-z]{3}\\s\\d{3}[A-Z]{2}$
#> 13          Merc 450SL              ^[A-Z][a-z]{3}\\s\\d{3}[A-Z]{2}$
#> 14         Merc 450SLC              ^[A-Z][a-z]{3}\\s\\d{3}[A-Z]{3}$
#> 15  Cadillac Fleetwood               ^[A-Z][a-z]{7}\\s[A-Z][a-z]{8}$
#> 16 Lincoln Continental              ^[A-Z][a-z]{6}\\s[A-Z][a-z]{10}$
#> 17   Chrysler Imperial               ^[A-Z][a-z]{7}\\s[A-Z][a-z]{7}$
#> 18            Fiat 128                      ^[A-Z][a-z]{3}\\s\\d{3}$
#> 19         Honda Civic               ^[A-Z][a-z]{4}\\s[A-Z][a-z]{4}$
#> 20      Toyota Corolla               ^[A-Z][a-z]{5}\\s[A-Z][a-z]{6}$
.........
all(map2_lgl(regex_df$string, regex_df$regex, ~grepl(.y, .x)))
#> [1] TRUE

可以看到,掌握了这三个R包后(可能后两个帮助会更大一些),遇到类似情况可以轻松提取数据或者直接交给函数识别出该模式正则的写法,即提高了分析效率,又对正则的写法有所收获,两全其美,快哉快哉~

相关文章
|
6月前
|
Python
除了`re`模块,还有哪些库可以用于正则表达式的匹配?
【2月更文挑战第11天】【2月更文挑战第31篇】
47 0
Python-初识正则表达式-指定匹配简单的日志数据
Python-初识正则表达式-指定匹配简单的日志数据
103 0
jmeter正则表达式提取器的用法和正则
jmeter正则表达式提取器的用法和正则
319 0
|
Python
正则表达式_re 模块
正则表达式_re 模块
113 0
|
开发者 Python
正则替换 | 学习笔记
快速学习 正则替换
110 0
正则替换 | 学习笔记
|
Python
【Python零基础入门篇 · 25】:正则基础、正则的高级用法、贪婪匹配与非贪婪匹配、原生字符串
【Python零基础入门篇 · 25】:正则基础、正则的高级用法、贪婪匹配与非贪婪匹配、原生字符串
226 0
【Python零基础入门篇 · 25】:正则基础、正则的高级用法、贪婪匹配与非贪婪匹配、原生字符串
|
PHP
PHP字符串学习之利用正则过滤字符,返回数字字符
在之前的文章《PHP字符串学习之怎么去除其他字符,只留下数字》中,我们介绍了利用for循环和in_array()或is_numeric()函数来提取字符串中数字字符的方法。这次我们继续PHP字符串的学习与练习,介绍一下提取字符串中数字字符的另几种方法。 提取字符串中数字字符,本质上就是字符串过滤操作。看到字符串过滤,我就想起了 “正则表达式”。
374 0
第175天:正则的用法
定义正则: 1 1 var re = new RegExp(“a”); //RegExp对象。参数就是我们想要制定的规则。有一种情况必须用这种方式,下面会提到。 2 2 var re = /a/; // 简写方法 推荐使用 性能更好 不能为空 不然以为是注释 ,  正则的常用方法  ...
1089 0