【发布时间】:2018-12-27 12:37:27
【问题描述】:
我已经定义了
vec <- "5f 110y, Fast"
和
gsub("[\\s0-9a-z]+,", "", vec)
给出“5f Fast”
我原以为它会给出“Fast”,因为逗号之前的所有内容都应该与正则表达式匹配。
谁能向我解释为什么不是这样?
【问题讨论】:
我已经定义了
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"
或者,使用带有 \s 和 perl=TRUE 参数的 PCRE 正则表达式:
> gsub("[\\s0-9a-z]+,", "", vec, perl=TRUE)
[1] " Fast"
要使 \s 匹配所有 Unicode 空格,请在模式开头添加 (*UCP) PCRE 动词:gsub("(*UCP)[\\s0-9a-z]+,", "", vec, perl=TRUE)。
【讨论】:
"[\\s0-9a-z]+," TRE 正则表达式匹配 1 个或多个 \、s、数字和小写 ASCII 字母,然后是单个 ,。这就是它与预期不匹配的原因。
\ 被视为文字反斜杠。在括号表达式之外,\ 可用于定义正则表达式转义,如 \s(匹配空格)、\d(数字),或转义特殊字符,如 (、[、*、等等。你不能在括号表达式中转义它们。要在 TRE 正则表达式的括号表达式中使用 [、]、^ 和 \,您可以使用 []\[^-] ("[]\\[^-]")。
\ 之外的文字 [] ,您必须再次对其进行转义:\\\\ 。
您能否尝试关注并告诉我这是否对您有帮助。
vec <- c("5f 110y, Fast")
gsub(".*,","",vec)
或
gsub("[[:alnum:]]+ [[:alnum:]]+,","",vec)
【讨论】:
尝试不同的正则表达式:
gsub("[[:blank:][:digit:][:lower:]]+,", "", vec)
#[1] " Fast"
或者,删除逗号后的空格,
gsub("[[:blank:][:digit:][:lower:]]+, ", "", vec)
#[1] "Fast"
【讨论】:
tidyverse 的解决方案是将str_replace 与您的原始正则表达式一起使用:
library(stringr)
str_replace(vec, "[\\s0-9a-z]+,", "")
【讨论】: