Регулярное выражение для замены запятой на разделитель точек - PullRequest
0 голосов
/ 24 апреля 2018

Я пытаюсь заменить разделитель запятыми на разделитель точек (и наоборот) в числах, в то время как строки могут иметь другие точки и запятые. Я пытался использовать 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(). Что я могу сделать тогда? Я имею в виду, что, возможно, я смогу написать функцию, которая будет соответствовать этому шаблону, затем в основном заменить , на . внутри этого шаблона и поместить его обратно в предложение. Однако я надеюсь, что есть более короткое решение для такой проблемы. Есть идеи?

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Вы можете сгруппировать каждую цифру в скобках и вызвать их во второй части подстановки.Ниже \\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"
0 голосов
/ 24 апреля 2018

Вы можете использовать группы захвата и ссылаться на них при замене:

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

# [1] "Today I bought apples, oranges for 3.55 dollars"
0 голосов
/ 24 апреля 2018

Мы можем использовать регулярное выражение, чтобы сопоставить , перед числовым и числовым значением и заменить его на .

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'
...