Проблема с регулярным выражением в gsub

Я определил

vec <- "5f 110y, Fast"

а также

gsub("[\\s0-9a-z]+,", "", vec)

дает " 5f Fast "

Я бы ожидал, что это даст " Fast ", поскольку все, перед запятой должно совпадать с регулярным выражением.

Может ли кто-нибудь объяснить мне, почему это не так?

Ответ 1

Вы должны иметь в виду, что в шаблонах регулярных выражений TRE вы не можете использовать escape-выражения, такие как \s, \d, \w.

Таким образом, регулярное выражение в вашем случае "[\\s0-9a-z]+,", соответствует 1 или более \, s, цифры и строчные буквы ASCII, а затем один ,.

Вместо этого вы можете использовать классы символов POSIX, например [:space:] (любые пробелы) или [:blank:] (горизонтальные пробелы):

> gsub("[[:space:]0-9a-z]+,", "", vec)
[1] " Fast"

Или используйте регулярное выражение PCRE с аргументом \s и perl=TRUE:

> gsub("[\\s0-9a-z]+,", "", vec, perl=TRUE)
[1] " Fast"

Чтобы заставить \s соответствовать всем пробелам Unicode, добавьте (*UCP) глагол PCRE при запуске шаблона: gsub("(*UCP)[\\s0-9a-z]+,", "", vec, perl=TRUE),

Ответ 2

Не могли бы вы попытаться рассказать об этом и сообщить мне, если это вам поможет.

vec <- c("5f 110y, Fast")
gsub(".*,","",vec)

ИЛИ ЖЕ

gsub("[[:alnum:]]+ [[:alnum:]]+,","",vec)

Ответ 3

tidyverse решением было бы использовать str_replace с оригинальным регулярным выражением:

library(stringr)

str_replace(vec, "[\\s0-9a-z]+,", "")

Ответ 4

Попробуйте другое регулярное выражение:

gsub("[[:blank:][:digit:][:lower:]]+,", "", vec)
#[1] " Fast"

Или, чтобы удалить пробел после запятой,

gsub("[[:blank:][:digit:][:lower:]]+, ", "", vec)
#[1] "Fast"