在 R 正则表达式中使用 shorthand 字符 类 内部字符 类

Using shorthand character classes inside character classes in R regex

我已经定义了

vec <- "5f 110y, Fast"

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

给出“5f Fast

我原以为它会给出“Fast”,因为逗号之前的所有内容都应该与正则表达式匹配。

任何人都可以向我解释为什么不是这样吗?

您应该记住,在 TRE 正则表达式模式中,您不能在括号表达式中使用正则表达式转义,例如 \s\d\w

因此,您的正则表达式 "[\s0-9a-z]+," 匹配 1 个或多个 \s、数字和小写 ASCII 字母,然后是单个 , .

您可以使用 POSIX 字符 类,例如 [:space:](任何空格)或 [:blank:](水平空格):

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

或者,使用带有 \sperl=TRUE 参数的 PCRE 正则表达式:

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

要使 \s 匹配所有 Unicode 空格,请在模式开头添加 (*UCP) PCRE 动词:gsub("(*UCP)[\s0-9a-z]+,", "", vec, perl=TRUE).

能否请您尝试以下操作,如果对您有帮助,请告诉我。

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

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

尝试不同的正则表达式:

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

或者,要删除逗号后的 space,

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

一个 tidyverse 解决方案是使用 str_replace 和你原来的正则表达式:

library(stringr)

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