R 正则表达式量词破折号与 {stringr} 与 {pointblank} 的逗号
R regex quantifier dash vs. comma with {stringr} vs. {pointblank}
我注意到 R 正则表达式量词的一些奇怪行为写成 {min, max}
(如 stringr cheatsheet) vs. as {min - max}
, when using the pointblank 包中的建议。我希望正则表达式与 {min, max}
一起工作并失败使用 {min - max}
。但是,在下面的两个示例中,一个使用 {min, max}
,一个使用 {min - max}
。
示例 1 按预期工作:pattern_comma
有效而 pattern_dash
不。但是示例 2 出人意料地工作:doi_pattern_comma
不 工作而 doi_pattern_dash
工作。
关于这个正则表达式有什么建议吗?或者这可能是 pointblank 中的错误(在这种情况下我可以在那里打开一个问题)?
谢谢 SO 社区!
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 package (v0.3.0)
于 2021-05-09 创建
你一定不要怀疑:{min-max}
quantifier does not exist, 你需要用
{min,max}
。 \d{4-9}
抛出异常(用 sub
试试,你会得到 invalid regular expression '\d{4-9}', reason 'Invalid contents of {}'
)。
接下来,第二个问题是正则表达式是用默认的TRE正则表达式引擎解析的,不能像\w
或[=18那样使用shorthand字符类 =] 里面的括号表达式,所以你 需要在方括号 .
里面使用 [: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
因此,所有正则表达式格式错误的情况 return NA
并且跳过这些项目的验证,最后通过它们。
结论:在 col_vals_regex
.
中使用它们之前,请始终测试您的正则表达式模式的有效性
我注意到 R 正则表达式量词的一些奇怪行为写成 {min, max}
(如 stringr cheatsheet) vs. as {min - max}
, when using the pointblank 包中的建议。我希望正则表达式与 {min, max}
一起工作并失败使用 {min - max}
。但是,在下面的两个示例中,一个使用 {min, max}
,一个使用 {min - max}
。
示例 1 按预期工作:pattern_comma
有效而 pattern_dash
不。但是示例 2 出人意料地工作:doi_pattern_comma
不 工作而 doi_pattern_dash
工作。
关于这个正则表达式有什么建议吗?或者这可能是 pointblank 中的错误(在这种情况下我可以在那里打开一个问题)?
谢谢 SO 社区!
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 package (v0.3.0)
于 2021-05-09 创建你一定不要怀疑:{min-max}
quantifier does not exist, 你需要用
{min,max}
。 \d{4-9}
抛出异常(用 sub
试试,你会得到 invalid regular expression '\d{4-9}', reason 'Invalid contents of {}'
)。
接下来,第二个问题是正则表达式是用默认的TRE正则表达式引擎解析的,不能像\w
或[=18那样使用shorthand字符类 =] 里面的括号表达式,所以你 需要在方括号 .
[: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
因此,所有正则表达式格式错误的情况 return NA
并且跳过这些项目的验证,最后通过它们。
结论:在 col_vals_regex
.