在 R 正则表达式的字符类中使用速记字符类
Posted
技术标签:
【中文标题】在 R 正则表达式的字符类中使用速记字符类【英文标题】:Using shorthand character classes inside character classes in R regex 【发布时间】:2018-12-27 12:37:27 【问题描述】:我已经定义了
vec <- "5f 110y, Fast"
和
gsub("[\\s0-9a-z]+,", "", vec)
给出“5f Fast
”
我原以为它会给出“Fast
”,因为逗号之前的所有内容都应该与正则表达式匹配。
谁能向我解释为什么不是这样?
【问题讨论】:
【参考方案1】:您应该记住,在 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)
。
【讨论】:
非常感谢您!我不知道 TRE 正则表达式和其他正则表达式类型之间的区别。 @ThanksABundle 是的,您的"[\\s0-9a-z]+,"
TRE 正则表达式匹配 1 个或多个 \
、s
、数字和小写 ASCII 字母,然后是单个 ,
。这就是它与预期不匹配的原因。
你能解释一下为什么 '\\' 在 '[ ]' 外面有效,但在里面无效。这只是 TRE 正则表达式的一个功能吗?
@ThanksABundle 在括号表达式中,\
被视为文字反斜杠。在括号表达式之外,\
可用于定义正则表达式转义,如 \s
(匹配空格)、\d
(数字),或转义特殊字符,如 (
、[
、*
、等等。你不能在括号表达式中转义它们。要在 TRE 正则表达式的括号表达式中使用 [
、]
、^
和 \
,您可以使用 []\[^-]
("[]\\[^-]"
)。
要匹配 \
之外的文字 []
,您必须再次对其进行转义:\\\\
。【参考方案2】:
您能否尝试关注并告诉我这是否对您有帮助。
vec <- c("5f 110y, Fast")
gsub(".*,","",vec)
或
gsub("[[:alnum:]]+ [[:alnum:]]+,","",vec)
【讨论】:
是的,这确实在这里工作,但在其他情况下对我的需求来说太笼统了。无论如何,我真的只对我上面的正则表达式不起作用的原因感兴趣 @ThanksABundle,现在请检查我的 OR 解决方案,然后告诉我? 是的,感谢您提供此替代解决方案。尽管如此,我仍然在问为什么我最初的正则表达式不起作用【参考方案3】:尝试不同的正则表达式:
gsub("[[:blank:][:digit:][:lower:]]+,", "", vec)
#[1] " Fast"
或者,删除逗号后的空格,
gsub("[[:blank:][:digit:][:lower:]]+, ", "", vec)
#[1] "Fast"
【讨论】:
【参考方案4】:tidyverse
的解决方案是将str_replace
与您的原始正则表达式一起使用:
library(stringr)
str_replace(vec, "[\\s0-9a-z]+,", "")
【讨论】:
好的,谢谢!我很奇怪在 gsub 和 str_replace 之间发现正则表达式行为的差异以上是关于在 R 正则表达式的字符类中使用速记字符类的主要内容,如果未能解决你的问题,请参考以下文章
我可以使一个正则表达式完全匹配一个类中的每个字符 - 即使字符在类中重复?