我有一个字符串3.4(2.5-4.7)
,我想在方括号“(”之前插入一个空格,以便该字符串变为3.4 (2.5-4.7)
。
有什么想法可以在R中完成吗?
答案 0 :(得分:2)
尝试
gsub('(.*)(\\(.*\\))', '\\1 \\2', '3.4(2.5-4.7)')
#[1] "3.4 (2.5-4.7)"
正则表达式的工作方式是创建两个组。第一组(.*)
包含所有元素,第二组(\\(.*\\))
包含括号后的所有元素。请注意,我们需要转义括号,因此我们使用\\(
。然后,我们将这两个组隔开\\1 \\2
答案 1 :(得分:2)
一种非常简短的方法是使用sub
,它将第一个开括号(
替换为一个空格,后跟一个开括号,即 (
。
x <- '3.4(2.5-4.7)'
sub("\\(", " (", x)
# [1] "3.4 (2.5-4.7)"
或者,您可以指定参数fixed = TRUE
,该参数认为模式是固定的而不是正则表达式。
x <- '3.4(2.5-4.7)'
sub("(", " (", x, fixed = TRUE)
# [1] "3.4 (2.5-4.7)"
答案 2 :(得分:2)
x <- "3.4(2.5-4.7)"
sub("(.*)(?=\\()", "\\1 ", x, perl = T)
[1] "3.4 (2.5-4.7)"
此正则表达式基于 lookahead :它创建一个捕获组,将所有内容包括在内,直到前瞻,即左括号(?=\\()
),对其进行调用并在其后插入一个空格sub
的替换参数中(这足够了,除非每个字符串有多个这样的替换,在这种情况下需要gsub
)。需要添加参数perl = T
来启用先行功能。
编辑:
如果您有这样的字符串:
x <- "3.4(2.5to4.7)"
正则表达式变得稍微复杂些;基本概念仍然保持不变:将字符串分成不同的捕获组(...)
,然后在替换参数中使用适当的反向引用并添加所需的空格时回想起来:
sub("(.*)(\\(\\d+\\.\\d+)(to)(\\d+\\.\\d+\\))", "\\1 \\2 \\3 \\4", x)
[1] "3.4 (2.5 to 4.7)"
EDIT2 :
x <- '3.4(2.5,4.7)'
sub("(.*)(\\(\\d+\\.\\d+)(,)(\\d+\\.\\d+\\))", "\\1 \\2\\3 \\4", x)
[1] "3.4 (2.5, 4.7)"
EDIT3 :
x <- '3(2,4)'
sub("(.*)(\\(\\d+)(,)(\\d+)", "\\1 \\2\\3 \\4", x)