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

时间:2017-08-24 19:22:36

标签: r regex

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

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

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

我有正则表达式here.

的工作示例

我可能会遇到一些问题。第一个可能是我写的正则表达式不受R的正则表达式引擎的支持。虽然我感觉来自this的感觉会得到支持。我已经看到R使用类似POSIX的格式,可以让事情变得有趣。第二个可能正好是下面的错误信息所显示的内容。这不是已编码的功能。然而,这将是最麻烦的,因为如果没有这个包,我不知道另一种方法来解决我的问题。

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

library("stringr")

string = " foo  foo_123bar      foo,bar,bazz\n  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正则表达式函数只接受模式,而不是包含我正在使用的多行和注释功能的额外参数。

1 个答案:

答案 0 :(得分:1)

你有一个PCRE正则表达式只能用于解析正则表达式与PCRE正则表达式库(或Boost,它基于PCRE)的方法/函数。 stringr str_extract使用ICU正则表达式库解析正则表达式。 ICU正则表达式不支持递归和DEFINE阻止。您不能使用in-pattern方法来定义子模式,然后重新使用它们。

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

library("stringr")
string = " foo  foo_123bar      foo,bar,bazz\n  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只允许访问整个匹配值。< / p>