Подтвердить что ты не робот

R регулярных выражений: неожиданное поведение "[: digit:]"

Я хотел бы извлечь элементы, начинающиеся с цифр из символьного вектора, но там что-то о синтаксисе регулярного выражения POSIX, который я не понимаю.

Я бы подумал, что

vec <- c("012 foo", "305 bar", "other", "notIt 7")
grep(pattern="[:digit:]", x=vec)

вернет 1 2 4, поскольку они являются четырьмя элементами, в которых есть цифры. Но на самом деле он возвращает 3 4.

Аналогично grep(pattern="^0", x=vec) возвращает 1, как я ожидал бы, потому что элемент 1 начинается с нуля. Однако grep(pattern="^[:digit:]", x=vec) возвращает integer(0), тогда как я ожидаю, что он вернет 1 2, поскольку это элементы, начинающиеся с цифр.

Как я не понимаю синтаксис?

4b9b3361

Ответ 1

Try

grep(pattern="[[:digit:]]", x=vec)

вместо этого, поскольку "мета-шаблоны" между двоеточиями обычно требуют двойных скобок.

Ответ 2

Другое решение

grep(pattern="\\d", x=vec)

Ответ 3

man 7 regex

В выражении скобки имя класса символов, заключенного в "[:" и ":]", обозначает список всех символов, принадлежащих этому классу. Стандартные имена классов символов:

         alnum       digit       punct
         alpha       graph       space
         blank       lower       upper
         cntrl       print       xdigit

Поэтому класс символов, являющийся единственным членом выражения скобки, будет выглядеть как двойные скобки, такие как [[:digit:]]. В качестве другого примера рассмотрим, что [[:alnum:]] эквивалентно [[:alpha:][:digit:]].