【问题标题】:Lookaround lookbefore regex for RR 的正则表达式前环顾四周
【发布时间】:2013-01-03 15:34:48
【问题描述】:

我正在尝试使用使用 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))

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

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

【问题讨论】:

    标签: regex r


    【解决方案1】:

    前瞻断言要求您将正则表达式标识为 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 使用匹配数据提取子字符串。

    【讨论】:

      【解决方案2】:

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

      sub('^([A-Z]+):.*$', '\\1', string)
      
      # [1] "MARKETING"  "FINANCE"    "OPERATIONS"
      

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

      【讨论】:

        猜你喜欢
        • 2011-01-25
        • 1970-01-01
        • 2020-07-16
        • 1970-01-01
        • 2018-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        相关资源
        最近更新 更多