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

标签 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)

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

最佳答案

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

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

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 code> 只允许访问整个匹配值。

关于使用 str_extract_all 在 R 中运行正则表达式 正则表达式尚未实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45869436/

相关文章:

r - 如何使用 Shiny 应用程序从另一个输出生成的输出?

r - 与 S3 存储桶的 Sparklyr 连接抛出错误

双引号之间的 JavaScript 文本

正则表达式仅匹配字母数字、连字符、下划线和句点,没有重复的标点符号

python - 匹配除某些单词之外的所有字符

r - 列多于列名?

algorithm - 为什么我的递归函数在 R 中这么慢?

linux - 使用 R Markdown 将 bash 脚本作为 Cron 作业运行

php - 在 Laravel 中使用阿拉伯字符作为 Slug

regex - typescript 无法解析正则表达式中的命名组