首页 > 解决方案 > R 正则表达式量词破折号与逗号与 {stringr} 与 {pointblank}

问题描述

在使用pointblank包时,我注意到 R 正则表达式量词写成的一些奇怪行为{min, max}(如stringr cheatsheet中推荐的那样)与 as 。我希望正则表达式可以与. 但是,在下面的两个示例中,一个与 . 一起使用,一个与.{min - max}{min, max}{min - max}{min, max}{min - max}

示例 1 按预期工作:pattern_comma工作和pattern_dash工作。但是示例 2 出乎意料地起作用:doi_pattern_comma不起作用并且确实doi_pattern_dash起作用。

关于这个正则表达式的任何建议?或者这可能是一个直截了当的错误(在这种情况下我可以在那里打开一个问题)?

谢谢你,社区!

library(dplyr)
library(stringr)
library(pointblank)

# EXAMPLE 1
df1 <- tibble(x = c("123", "68"))
pattern_comma <- "^\\d{1,3}$"
pattern_dash <- "^\\d{1-3}$"

stringr::str_detect(df1$x, pattern_comma) #pass

#> [1] TRUE TRUE

stringr::str_detect(df1$x, pattern_dash)  #fail

#> Error in stri_detect_regex(string, pattern, negate = negate, opts_regex = opts(pattern)): Error in {min,max} interval. (U_REGEX_BAD_INTERVAL, context=`^\d{1-3}$`)


#pass
df1 %>% 
  pointblank::col_vals_regex(
    vars(x), 
    pattern_comma
  )

#> # A tibble: 2 x 1
#>   x    
#>   <chr>
#> 1 123  
#> 2 68


#fail
df1 %>% 
  pointblank::col_vals_regex(
    vars(x), 
    pattern_dash
  )

#> Error: Exceedance of failed test units where values in `x` should have matched the regular expression: `^\d{1-3}$`.
#> The `col_vals_regex()` validation failed beyond the absolute threshold level (1).
#> * failure level (2) >= failure threshold (1)



# EXAMPLE 2
df2 <- tibble(doi = c("10.1186/s12872-020-01551-9", "10.1002/cpp.1968"))
doi_pattern_comma <- "^10\\.\\d{4,9}/[-.;()/:\\w\\d]+$"
doi_pattern_dash <- "^10\\.\\d{4-9}/[-.;()/:\\w\\d]+$"

stringr::str_detect(df2$doi, doi_pattern_comma) #pass

#> [1] TRUE TRUE

stringr::str_detect(df2$doi, doi_pattern_dash)  #fail

#> Error in stri_detect_regex(string, pattern, negate = negate, opts_regex = opts(pattern)): Error in {min,max} interval. (U_REGEX_BAD_INTERVAL, context=`^10\.\d{4-9}/[-.;()/:\w\d]+$`)


#fail
df2 %>% 
  col_vals_regex(
    vars(doi), 
    doi_pattern_comma
  )

#> Error: Exceedance of failed test units where values in `doi` should have matched the regular expression: `^10\.\d{4,9}/[-.;()/:\w\d]+$`.
#> The `col_vals_regex()` validation failed beyond the absolute threshold level (1).
#> * failure level (2) >= failure threshold (1)


#pass
df2 %>% 
  col_vals_regex(
    vars(doi), 
    doi_pattern_dash
  )

#> # A tibble: 2 x 1
#>   doi                       
#>   <chr>                     
#> 1 10.1186/s12872-020-01551-9
#> 2 10.1002/cpp.1968

reprex 包(v0.3.0)于 2021-05-09 创建

标签: rregexvalidationstringrassertion

解决方案


你一定不要怀疑:{min-max} 量词不存在你需要使用 {min,max}\d{4-9}抛出异常(尝试一下sub,你会得到invalid regular expression '\d{4-9}', reason 'Invalid contents of {}' )。

接下来,第二个问题是正则表达式是使用默认的 TRE 正则表达式引擎解析的,并且您不能在那里使用简写字符类,如\wor\W内括号表达式,因此您需要使用[:alnum:]_而不是\w内方括号

现在,您知道正确的正则表达式:

"^10\\.\\d{4,9}/[-.;()/:[:alnum:]_]+$"

你可以潜得更深。

如果你使用,你可以看到你得到什么结果test_col_vals_regex

> df2 %>% test_col_vals_regex(vars(doi), "^10\\.\\d{4,9}/[-.;()/:[:alnum:]_]+$")
[1] TRUE
> df2 %>% test_col_vals_regex(vars(doi), "^10\\.\\d{4-9}/[-.;()/:[:alnum:]_]+$")
[1] NA
> df2 %>% test_col_vals_regex(vars(doi), "^10\\.\\d{4,9}/[-.;()/:\\w]+$")
[1] FALSE
> df2 %>% test_col_vals_regex(vars(doi), "^10\\.\\d{4-9}/[-.;()/:\\w]+$")
[1] NA

因此,所有正则表达式格式错误的情况都会返回NA并且跳过对这些项目的验证,最后通过它们。

结论:在将它们用于col_vals_regex.


推荐阅读