我想更换括号和在字符串变量括号之间的文本。但是我只要替换具有至少一个数那些括号中它。
示例字符串:
text <- c("Sekretär (dipl.) (G3)", "Zolldeklarant (3 Jahre)", "Grenzwächter (< 2 Jahre)")
我尝试了以下操作:
str_extract_all(text, " *\\(.*?\\d+.*?\\) *")
它确实提取括号中的文字,但在第一个,它也匹配的第一个括号,没有任何数字。
提取应该看起来像:
" (G3)"
" (3 Jahre)"
" (< 2 Jahre)"
答案 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)。
此外,如果要始终提取最后一个括号,则可以采用其他方法。