R regex quantifier dash vs. comma with {stringr} vs. {pointb



我注意到使用 pointblank 包时,将 R 正则表达式量词写成{min, max}(如字符串备忘单中的建议)与{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}/[-.;()/:wd]+$`)

#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}/[-.;()/:wd]+$`.
#> 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

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

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

接下来,第二个问题是正则表达式是使用默认的 TRE 正则表达式引擎解析的,并且您不能在那里使用wW括号表达式等速记字符类,因此您需要使用[: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中使用正则表达式模式之前,请务必测试它们的有效性。

相关内容

  • 没有找到相关文章

最新更新