【问题标题】:Regular expression in R for finding spaces between known wordsR中的正则表达式用于查找已知单词之间的空格
【发布时间】:2022-08-11 01:12:25
【问题描述】:

我在 R 中有几个像这样的字符向量:

a <- \"NOTE      3/1\"
b <- \"NOTE   4.3%\"

所有这些都以一个已知的单词开头 - NOTE - 后面是不同数量的空格和其他字符。

我想要做的是在字符串中找到NOTE 和其他字符之间的空格,然后用另一个字符替换每个空格 - 比如@

所需的输出将是:

\"NOTE@@@@@@3/1\"
\"NOTE@@@4.3%\"

到目前为止,我只能找到能够找到NOTE 的正则表达式及其后面的空格。

c <- gsub(\"NOTE\\\\s+\", \"@\", a)
c
[1] \"@3/1\"

    标签: r regex spaces


    【解决方案1】:

    使用[[:space:]] 的另一个选项如下:

    a <- "NOTE      3/1"
    b <- "NOTE   4.3%"
    
    lapply(list(a,b), function(x) gsub("[[:space:]]", "@", x))
    #> [[1]]
    #> [1] "NOTE@@@@@@3/1"
    #> 
    #> [[2]]
    #> [1] "NOTE@@@4.3%"
    

    reprex package (v2.0.1) 于 2022 年 8 月 10 日创建

    【讨论】:

      【解决方案2】:

      您可以使用

      gsub("(?:\\G(?!^)|^NOTE)\\K\\s", "@", a, perl=TRUE)
      

      请参阅 regex demoR demo

      a <- "NOTE      3/1"
      b <- "NOTE   4.3%"
      gsub("(?:\\G(?!^)|^NOTE)\\K\\s", "@", a, perl=TRUE)
      # => [1] "NOTE@@@@@@3/1"
      gsub("(?:\\G(?!^)|^NOTE)\\K\\s", "@", b, perl=TRUE)
      # => [1] "NOTE@@@4.3%"
      

      细节

      • (?:\G(?!^)|^NOTE) - 上一次成功匹配的结尾或NOTE 在字符串的开头(如果它不总是在字符串的开头,只需删除^ 锚点,或使用\\b 匹配一个词的边界)
      • \K - 匹配重置运算符,丢弃到目前为止匹配的文本
      • \s - 一个空格字符。

      这是一个stringr 版本(^ 为了更清晰而被删除),其中NOTE 之后匹配的空格在function(x) str_replace_all(x, "\\s", "@") 回调函数中分别替换为@ 字符:

      library(stringr)
      stringr::str_replace_all(a, "NOTE\\s+", function(x) str_replace_all(x, "\\s", "@"))
      # => [1] "NOTE@@@@@@3/1"
      stringr::str_replace_all(b, "NOTE\\s+", function(x) str_replace_all(x, "\\s", "@"))
      # => [1] "NOTE@@@4.3%"
      

      【讨论】:

        猜你喜欢
        • 2022-12-23
        • 2017-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-23
        • 1970-01-01
        • 2013-03-06
        • 2021-01-06
        相关资源
        最近更新 更多