Проблема с регулярным выражением в 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"