gsub("(?<![0-9])0+", "", c("005", "0AB", "000", "0"), perl = TRUE)
#> [1] "5" "AB" "" ""
gsub("(^|[^0-9])0+", "\\1", c("005", "0AB", "000", "0"), perl = TRUE)
#> [1] "5" "AB" "" ""
Приведенное выше регулярное выражение взято из этого потока SO, объясняющего, как удалить все начальные нули из строки в R. В результате этого регулярного выражения и «000», и «0» преобразуются в «». Вместо этого я хочу удалить все начальные нули из строки символов, за исключением случаев, когда последний символ равен нулю или единственный символ равен нулю.
"005" would become "5"
"0AB" would become "AB"
"000" would become "0"
"0" would become "0"
Этот другой поток SO объясняет, как делать то, что я хочу, но я не думаю, что я получаю синтаксис достаточно правильно, применяя решение в R. И я не очень понимаю различие между 1-м и 2-м решениями ниже ( если они действительно работали).
gsub("s/^0*(\d+)$/$1/;", "", c("005", "0AB", "000", "0"), perl = TRUE) # 1st solution
# Error: '\d' is an unrecognized escape in character string starting ""s/^0*(\d"
gsub("s/0*(\d+)/$1/;", "", c("005", "0AB", "000", "0"), perl = TRUE) # 2nd solution
# Error: '\d' is an unrecognized escape in character string starting ""s/0*(\d"
Что такое правильное регулярное выражение в R, чтобы получить то, что я хочу?
regex
новичек. Что разница в производительности (или другие предпочтения) между рисунком и этим^0*(.+)$
или^0+(.+)$
?.
могут совпадать,0
и оба соседних шаблона неопределенно количественно, но совсем немного.Мы можем добавить еще одно условие с помощью регулярного выражения, чтобы проверить наличие ненулевых значений после одного или нескольких нулей (
0+
)данные
источник
regex
гуру в любом случае, но взгляды не эффективны, не так ли? Поскольку у вас есть два,sub
вы можете удалить все ведущие нули и заменить""
на0
?sub("^$", "0", sub("^0+", "", v1), perl = TRUE)
При использовании нон границы слова . Смотрите это демо на regex101 или R демо на tio.run .
\B
Это не будет соответствовать последнему нулю, потому что справа от него нет слова символа .
источник
Вы можете использовать чередование для совпадения всех нулей в строке в группе захвата или совпадения всех нулей в начале строки.
В замене используйте группу 1.
Regex demo | R демо
Например
Вывод
Или даже лучше, как прокомментировал Wiktor Stribiżew , вы можете использовать захват одного 0 в группе и повторение самой группы, чтобы захватить последний экземпляр нуля.
Regex demo
источник
^(0)+$|^0+
sub("^0+(?!$)", "", x, perl=TRUE)
, также будет работатьДругой
regex
вариант:Вот демонстрация регулярных выражений .
Использование
base::sub
в R:Вот R демо .
Или расширив ответ @ akrun :
источник