我正在尝试将逗号分隔符替换为数字中的点分隔符(反之亦然),而行可能有其他点和逗号。我尝试使用gsub(),但不知道如何阻止它将替换模式识别为字符串。
例如,假设我有一行
`Today I bought apples, oranges for 3,55 dollars`
我希望以价格将逗号分隔符替换为点分隔符:
`Today I bought apples, oranges for 3.55 dollars`
天真的gsub
方法无法正常工作:
`gsub('[[:digit:]],[[:digit:]]',
'[[:digit:]][.][[:digit:]]',
'Today I bought apples, oranges for 3,55 dollars')`
显然给出[1] "Today I bought apples, oranges for [[:digit:]][.][[:digit:]]5 dollars"
,即gsub将替换视为字符行。
我无法向gsub()
提供除字符串以外的任何内容。那我该怎么办?我记得也许我可以编写一个匹配此模式的函数,然后基本上将,
替换为此模式中的.
并将其放回句子中。但是,我希望有一个更短的解决方案来解决这个问题。有什么想法吗?
答案 0 :(得分:3)
您可以使用捕获组并在替换中引用它们:
gsub("(\\d+),(\\d+)", "\\1.\\2", "Today I bought apples, oranges for 3,55 dollars")
# [1] "Today I bought apples, oranges for 3.55 dollars"
答案 1 :(得分:1)
我们可以使用正则表达式外观匹配数字和数值前的,
,并将其替换为.
gsub("(?<=[0-9]),(?=[0-9])", ".", str1, perl = TRUE)
#[1] "Today I bought apples, oranges for 3.55 dollars"
str1 <- 'Today I bought apples, oranges for 3,55 dollars'
答案 2 :(得分:1)
您可以使用括号对每个数字进行分组,并在替换的第二部分中调用它们。 \\1
下面会回忆第一组括号,第二组回复\\2
。
gsub('([[:digit:]]),([[:digit:]])','\\1.\\2','Today I bought apples, oranges for 3,55 dollars')
# [1] "Today I bought apples, oranges for 3.55 dollars"