【问题标题】:Using shorthand character classes inside character classes in R regex在 R 正则表达式的字符类中使用速记字符类
【发布时间】:2018-12-27 12:37:27
【问题描述】:

我已经定义了

vec <- "5f 110y, Fast"

gsub("[\\s0-9a-z]+,", "", vec)

给出“5f Fast

我原以为它会给出“Fast”,因为逗号之前的所有内容都应该与正则表达式匹配。

谁能向我解释为什么不是这样?

【问题讨论】:

    标签: r regex gsub


    【解决方案1】:

    您应该记住,在 TRE 正则表达式模式中,您不能在括号表达式中使用像 \s\d\w 这样的正则表达式转义。

    因此,在您的情况下,正则表达式 "[\\s0-9a-z]+," 匹配 1 个或多个 \s、数字和小写 ASCII 字母,然后是单个 ,

    您可以改用 POSIX 字符类,例如 [:space:](任何空格)或 [:blank:](水平空格):

    > gsub("[[:space:]0-9a-z]+,", "", vec)
    [1] " Fast"
    

    或者,使用带有 \sperl=TRUE 参数的 PCRE 正则表达式:

    > gsub("[\\s0-9a-z]+,", "", vec, perl=TRUE)
    [1] " Fast"
    

    要使 \s 匹配所有 Unicode 空格,请在模式开头添加 (*UCP) PCRE 动词:gsub("(*UCP)[\\s0-9a-z]+,", "", vec, perl=TRUE)

    【讨论】:

    • 非常感谢您!我不知道 TRE 正则表达式和其他正则表达式类型之间的区别。
    • @ThanksABundle 是的,您的 "[\\s0-9a-z]+," TRE 正则表达式匹配 1 个或多个 \s、数字和小写 ASCII 字母,然后是单个 ,。这就是它与预期不匹配的原因。
    • 你能解释一下为什么 '\\' 在 '[ ]' 外面有效,但在里面无效。这只是 TRE 正则表达式的一个功能吗?
    • @ThanksABundle 在括号表达式中,\ 被视为文字反斜杠。在括号表达式之外,\ 可用于定义正则表达式转义,如 \s(匹配空格)、\d(数字),或转义特殊字符,如 ([*、等等。你不能在括号表达式中转义它们。要在 TRE 正则表达式的括号表达式中使用 []^\,您可以使用 []\[^-] ("[]\\[^-]")。
    • 要匹配 \ 之外的文字 [] ,您必须再次对其进行转义:\\\\
    【解决方案2】:

    您能否尝试关注并告诉我这是否对您有帮助。

    vec <- c("5f 110y, Fast")
    gsub(".*,","",vec)
    

    gsub("[[:alnum:]]+ [[:alnum:]]+,","",vec)
    

    【讨论】:

    • 是的,这确实在这里工作,但在其他情况下对我的需求来说太笼统了。无论如何,我真的只对我上面的正则表达式不起作用的原因感兴趣
    • @ThanksABundle,现在请检查我的 OR 解决方案,然后告诉我?
    • 是的,感谢您提供此替代解决方案。尽管如此,我仍然在问为什么我最初的正则表达式不起作用
    【解决方案3】:

    尝试不同的正则表达式:

    gsub("[[:blank:][:digit:][:lower:]]+,", "", vec)
    #[1] " Fast"
    

    或者,删除逗号后的空格,

    gsub("[[:blank:][:digit:][:lower:]]+, ", "", vec)
    #[1] "Fast"
    

    【讨论】:

      【解决方案4】:

      tidyverse 的解决方案是将str_replace 与您的原始正则表达式一起使用:

      library(stringr)
      
      str_replace(vec, "[\\s0-9a-z]+,", "")
      

      【讨论】:

      • 好的,谢谢!我很奇怪在 gsub 和 str_replace 之间发现正则表达式行为的差异
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 2017-05-22
      • 2017-08-14
      相关资源
      最近更新 更多