使用 str_extract_all 在 R 中运行正则表达式尚未实现



我正在尝试使用正则表达式来解析使用正则表达式的文件。在 R 中使用正则表达式的大多数解决方案都使用字符串包。我没有找到另一种方法,或者另一个可以使用的软件包。如果您有另一种方法,那也是可以接受的。

我试图完成的是获取几个由空格分隔的值,最后一个值是一些可变长度的逗号分隔值。这应该以表格格式进入矩阵或 df 格式,就像它目前一样。

foo     foo_123bar      foo,bar,bazz
foo2    foo_456bar      foo2,bar2

我这里有我的正则表达式的工作示例。

我可能会遇到几个问题。第一个可能是我正在编写的正则表达式不受 R 正则表达式引擎的支持。虽然我从中有一种会得到支持的感觉。我已经看到R使用类似POSIX的格式,这可能会使事情变得有趣。第二个可能正是下面错误消息显示的内容。这不是尚未编码的功能。然而,这将是最令人不安的,因为如果没有这个包,我不知道另一种解决问题的方法。

下面是我用来复制此错误的 R 代码

library("stringr")
string = " foo  foo_123bar      foo,bar,bazzn  foo2    foo_456bar      foo2,bar2,bazz2"
pattern = "
(?(DEFINE)
(?<blanks>[[:blank:]]+)
(?<var>"?[[:alnum:]_]+"?)
(?<csvar>("?[[:alnum:]_]+"?,?)+)
)
^
(?&blanks)((?&var))
(?&blanks)((?&var))
(?&blanks)((?&csvar))"
# Both of these are throwing the error
str_extract_all(string, pattern)
str_extract_all(string, regex(pattern, multiline=TRUE, comments=TRUE))
> Error in stri_extract_all_regex(string, pattern, simplify = simplify,  : 
> Use of regexp feature that is not yet implemented. (U_REGEX_UNIMPLEMENTED)

# Using the example from ?str_extract_all runs without error
shopping_list <- c("apples x4", "bag of flour", "bag of sugar", "milk x2")
str_extract_all(shopping_list, "\b[a-z]+\b", simplify = TRUE)

我正在寻找一个解决方案,不一定是纵梁解决方案,但这是我找到的唯一适合我需求的方法。其他更简单的 R 正则表达式函数仅接受模式,而不接受包含我正在使用的多行和注释功能的额外参数。

您有一个 PCRE 正则表达式,它只能在使用 PCRE 正则表达式库(或 Boost,它基于 PCRE(解析正则表达式的方法/函数中使用。纵梁str_extract使用 ICU 正则表达式库解析正则表达式。ICU 正则表达式不支持递归和DEFINE块。您只是不能使用模式内方法来定义子模式,然后重用它们。

相反,只需将您需要重用的正则表达式部分声明为变量并动态构建模式:

library("stringr")
string = " foo  foo_123bar      foo,bar,bazzn  foo2    foo_456bar      foo2,bar2,bazz2"
blanks <- "[[:blank:]]+"
vars <- ""?[[:alnum:]_]+"?"
csvar <- "(?:"?[[:alnum:]_]+"?,?)+"
pattern <- paste0("^",blanks,"(", vars, ")",blanks,"(", vars,")",blanks,"(",csvar, ")")
str_match_all(string, pattern)
# [[1]]
#     [,1]                                 [,2]  [,3]         [,4]          
#[1,] " foo  foo_123bar      foo,bar,bazz" "foo" "foo_123bar" "foo,bar,bazz"

注意:您需要使用str_match(或str_match_all(提取捕获组值,因为str_extractstr_extract_all仅允许访问整个匹配值。

最新更新