首页 > 解决方案 > 有没有人可以使用 R 解释基本正则表达式的结果?

问题描述

1.

test1
# [1] "abcd" "abc1" "ab2b" "a3cd" "4bcd"    
test1[grep('[^abc1-3]', test1)]
# [1] "abcd" "a3cd" "4bcd"
test1[grep('[^a-d1-3]', test1)]
# [1] "4bcd"
test1[grep('[^4]', test1)]
# [1] "abcd" "abc1" "ab2b" "a3cd" "4bcd"

2.

test5 <- c('lo', 'lol', 'lolo', 'olo', 'lool')
test5[grep('loll*', test5)]
# [1] "lol"  "lolo"

3.

test5
# [1] "lo"   "lol"  "lolo" "olo"  "lool"
test5[grep('lolo+', test5)]
# [1] "lolo"
test5[grep('lol+', test5)]
# [1] "lol"  "lolo"

我正在研究使用 R 的正则表达式的基本内容。但我不明白为什么上面三个示例会返回这些结果。

例如,当在 [] 中使用 ^ 时,我了解到它返回的字符不涉及 ^ 后面的字母。但结果似乎并非如此。

我不擅长英语,所以我很难解释各种我无法理解的事情,但如果有人能教我为什么这些 R 代码会返回这些结果,我将不胜感激。

:(

标签: rregex

解决方案


您是正确的,"[^abc1-3]"它将匹配不在 {a, b, c, 1, 2, 3} 中的任何字符。

grep如果有任何匹配将返回 TRUE,如果没有匹配则返回 FALSE。

test1
# [1] "abcd" "abc1" "ab2b" "a3cd" "4bcd"    
test1[grep('[^abc1-3]', test1)]
# [1] "abcd" "a3cd" "4bcd"

三个结果有d,不在{a, b, c, 1, 2, 3},所以d匹配(最后一个有4,也匹配)。结果中没有的两个测试项,"abc1"只有 "ab2b"中的字符{a, b, c, 1, 2, 3},所以不匹配。

Regex101 是一个测试正则表达式并了解它们如何工作的好站点。这是这个例子:https ://regex101.com/r/CaxfCI/1

对于您的其他示例,

  • *表示0 或更多。所以'loll*'匹配lol后跟 0 或更多l
  • +表示1 个或多个。所以 'lol+'匹配lo后跟 1 或更多l

请注意,对于grep,没有任何意义'loll*'... 结果将与 for 相同'lol'。但在其他正则表达式操作中,如果您要替换(替换)或提取匹配项,则差异可能很重要。


推荐阅读