R中的正则表达式具有负后观

Jon*_*ton 12 regex r negative-lookbehind

所以我有以下数据,比如称为"my_data":

Storm.Type
TYPHOON
SEVERE STORM
TROPICAL STORM
SNOWSTORM AND HIGH WINDS
Run Code Online (Sandbox Code Playgroud)

我想要的是分类my_data $ Storm.Type中的每个元素是否是风暴,但我不想将热带风暴包括为暴风雨(我要将它们分开分类),这样我就可以了

Storm.Type                    Is.Storm
TYPHOON                       0
SEVERE STORM                  1
TROPICAL STORM                0
SNOWSTORM AND HIGH WINDS      1
Run Code Online (Sandbox Code Playgroud)

我写了以下代码:

my_data$Is.Storm  <-  my_data[grep("(?<!TROPICAL) (?i)STORM"), "Storm.Type"]
Run Code Online (Sandbox Code Playgroud)

但这只会让"严重风暴"成为一场风暴(但不会让SNOWSTORM和HIGH WINDS失效).谢谢!

Blu*_*ter 9

问题是你正在寻找" STORM"具有前面空格的字符串,所以"SNOWSTORM"不符合条件.

作为修复,考虑将空间移动到负面的lookbehind断言中,如下所示:

ss <- c("TYPHOON","SEVERE STORM","TROPICAL STORM","SNOWSTORM AND HIGH WINDS",
        "THUNDERSTORM")
grep("(?<!TROPICAL )(?i)STORM", ss, perl = TRUE)
# [1] 2 4 5
grepl("(?<!TROPICAL )(?i)STORM", ss, perl = TRUE)
# [1] FALSE  TRUE FALSE  TRUE  TRUE
Run Code Online (Sandbox Code Playgroud)

我不知道这一点,(?i)并(?-i)设置你是否在正则表达式中忽略大小写.酷找.另一种方法是ignore.case标志:

grepl("(?<!tropical )storm", ss, perl = TRUE, ignore.case = TRUE)
# [1] FALSE  TRUE FALSE  TRUE  TRUE
Run Code Online (Sandbox Code Playgroud)

然后定义您的列:

my_data$Is.Storm  <-  grepl("(?<!tropical )storm", my_data$Storm.Type,
                            perl = TRUE, ignore.case = TRUE)
Run Code Online (Sandbox Code Playgroud)