仅将括号与R中的文本和数字匹配

时间:2019-01-31 10:27:20

标签: r regex string-matching

我想更换括号和在字符串变量括号之间的文本。但是我只要替换具有至少一个数那些括号中它。

示例字符串:

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

我尝试了以下操作:

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

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

提取应该看起来像:

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

3 个答案:

答案 0 :(得分:2)

如果要在括号中替换这些术语,且至少包含一个数字,则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替换整个字符串。

答案 1 :(得分:1)

您可以使用

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

请参见a demo on regex101.com
反斜杠需要在R中进行两次转义,因此您的表达式将变为

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


细分为

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

答案 2 :(得分:0)

text <- c("Sekretär (dipl.) (G3)", "Zolldeklarant (3 Jahre)", "Grenzwächter (< 2 Jahre)")
gsub(".*\\((.*[0-9].*)\\).*","(\\1)",text)

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

此外,如果要始终提取最后一个括号,则可以采用其他方法。