正则表达式将逗号替换为点分隔符

Regex to replace comma to dot separator

我正在尝试将数字中的逗号分隔符替换为点分隔符(反之亦然),而行可能有其他点和逗号。我尝试使用 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() 的字符串,我不能提供任何东西。那我该怎么办?我想到也许我可以编写一个匹配此模式的函数,然后基本上将此模式内的 , 替换为 . 并将其放回句子中。但是,我希望有一个更短的解决方案来解决这样的问题。有什么想法吗?

我们可以使用正则表达式环视来匹配数字和数值前的 ,,并将其替换为 .

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'

您可以用括号将每个数字分组,并在替换的第二部分回忆它们。下面 \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"

您可以使用捕获组并在替换中引用它们:

gsub("(\d+),(\d+)", "\1.\2", "Today I bought apples, oranges for 3,55 dollars")

# [1] "Today I bought apples, oranges for 3.55 dollars"