6

我正在尝试使用 stringr 包使用正则表达式来提取一些文本。出于某种原因,我收到“无效的正则表达式”错误。我在一些网站测试工具中尝试过正则表达式,它似乎在那里工作。我想知道正则表达式在 R 中的工作方式是否有独特之处,尤其是在 stringr 包中。

这是一个例子:

string <- c("MARKETING:  Vice President", "FINANCE:  Accountant I",
"OPERATIONS: Plant Manager")

pattern <- "[A-Z]+(?=:)"
test <- gsub(" ","",string)
results <- str_extract(test, pattern)

这似乎不起作用。我想得到没有“:”的“营销”、“财务”和“运营”。这就是我使用前瞻语法的原因。我意识到我可以使用以下方法解决这个问题:

pattern <- "[A-Z]+(:)"
test <- gsub(" ","",string)
results <- gsub(":","",str_extract(test, pattern))

但我预计在不久的将来我可能需要在比这更复杂的情况下使用环视。

我是否需要用一些转义或其他东西来修改正则表达式以使其工作?

4

2 回答 2

6

前瞻断言要求您将正则表达式标识为 R 中的 perl 正则表达式。

str_extract(string, perl(pattern))
# [1] "MARKETING"  "FINANCE"    "OPERATIONS"

您也可以在基础 R 中轻松做到这一点:

regmatches(string, regexpr(pattern, string, perl=TRUE))
# [1] "MARKETING"  "FINANCE"    "OPERATIONS"

regexpr查找匹配项并regmatches使用匹配数据提取子字符串。

于 2013-01-03T15:52:22.530 回答
2

您可以直接使用sub和分组来执行此操作。

sub('^([A-Z]+):.*$', '\\1', string)

# [1] "MARKETING"  "FINANCE"    "OPERATIONS"

我将组固定到一行的开头,寻找一个或多个大写字母并保存它们。它们后面必须跟一个冒号,:然后是零个或多个附加字符。

于 2013-01-03T15:38:14.127 回答