【问题标题】:Match only parenthesis with text and numbers in R仅将括号与 R 中的文本和数字匹配
【发布时间】:2019-06-24 18:54:53
【问题描述】:

我想替换字符串变量中的括号和括号之间的文本。但是我只想用其中至少一个数字替换那些括号。

示例字符串:

text <- c("Sekretär (dipl.) (G3)", "Zolldeklarant (3 Jahre)", "Grenzwächter (< 2 Jahre)")

我尝试了以下方法:

str_extract_all(text, " *\\(.*?\\d+.*?\\) *")

它确实提取了括号中的文本,但在第一个括号中,它也匹配第一个括号,没有任何数字。

提取应该如下所示:

" (G3)"
" (3 Jahre)"  
" (< 2 Jahre)"

【问题讨论】:

    标签: r regex string-matching


    【解决方案1】:

    如果您想替换括号中的这些术语,至少包含一个数字,那么sub 是一个很好的基础 R 选项:

    text
    sapply(text, function (x) {
        gsub("\\([^()]*\\d[^()]*\\)", "REMOVED", x)
    })
    
    [1] "Sekretär (dipl.) (G3)"    "Zolldeklarant (3 Jahre)" "Grenzwächter (< 2 Jahre)"
    [1] "Sekretär (dipl.) REMOVED"    "Zolldeklarant REMOVED" "Grenzwächter REMOVED"
    

    我已替换为文字文本 REMOVED,只是作为显示替换的占位符。

    编辑:

    如果您只是想提取这些术语,我们也可以使用sub

    sapply(text, function (x) {
        gsub(".*(\\([^()]*\\d[^()]*\\)).*", "\\1", x)
    })
    
    [1] "(G3)" "(3 Jahre)" "(< 2 Jahre)"
    

    在这里,我们捕获括号中的术语,然后将整个字符串替换为仅第一个(也是唯一一个)捕获组\\1

    【讨论】:

    • @Jan 我也不确定,但如果“替换”的含义与该词的实际含义不同,那就太奇怪了。无论如何,我添加了一个涵盖这种可能性的更新。
    • @K.Schupbach:如果它对您有用,请考虑接受并支持给定的答案(箭头,左侧打勾)。
    【解决方案2】:

    你可以使用

    \([^()]*\d+[^()]*\)
    

    a demo on regex101.com
    R 中的反斜杠需要双转义,这样你的表达式就会变成

    \\([^()]*\\d+[^()]*\\)
    


    分解这是
    \(     # (
    [^()]* # not ( nor ), 0+ times
    \d+    # digits, 1+
    [^()]* # same as above
    \)     # )
    

    【讨论】:

    • 赞成,我建议你的分支远离纯正则表达式,并选择一些 R、Java、C# 等,因为这将扩展你的标签库:-)
    • 在 d+ 之前缺少一个反冲(对于 R):\([^()]*\\d+[^()]*\) 否则完美。
    【解决方案3】:
    text <- c("Sekretär (dipl.) (G3)", "Zolldeklarant (3 Jahre)", "Grenzwächter (< 2 Jahre)")
    gsub(".*\\((.*[0-9].*)\\).*","(\\1)",text)
    

    基本上,您要求 gsub 选择整个字符串,但将括号中的字符串分配为一组 (\1) 并包括一个数字。

    另外,如果您想始终提取最后一个括号,则可以采用不同的方法。

    【讨论】:

      猜你喜欢
      • 2019-02-03
      • 2014-05-23
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多