在 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"

或者,使用带有 \sperl=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 正则表达式的字符类中使用速记字符类的主要内容,如果未能解决你的问题,请参考以下文章

python3的正则表达式(regex)

我可以使一个正则表达式完全匹配一个类中的每个字符 - 即使字符在类中重复?

Java中正则表达式以及Pattern和Matcher类

如何用正则表达式匹配连字符?

java正则表达式,要求字符串只能包含数字、英文大小写、以及“-”符号

正则表达式