regex - R 中的正则表达式,带有负向后视

标签 regex r negative-lookbehind

所以我有以下数据,假设称为“my_data”:

Storm.Type
TYPHOON
SEVERE STORM
TROPICAL STORM
SNOWSTORM AND HIGH WINDS

我想要的是对 my_data$Storm.Type 中的每个元素是否是 Storm 进行分类,但我不想将热带 Storm 包括为 Storm (我将分别对它们进行分类),这样我就会有
Storm.Type                    Is.Storm
TYPHOON                       0
SEVERE STORM                  1
TROPICAL STORM                0
SNOWSTORM AND HIGH WINDS      1

我编写了以下代码:
my_data$Is.Storm  <-  my_data[grep("(?<!TROPICAL) (?i)STORM"), "Storm.Type"]

但这只会将“SEVERE STORM”返回为 Storm (但不包括暴风雪和大风)。谢谢!

最佳答案

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

作为解决方案,请考虑将空间移动到您的否定回顾断言中,如下所示:

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

我不知道(?i)(?-i)设置是否在正则表达式中忽略大小写。很酷的发现。另一种方法是ignore.case旗帜:
grepl("(?<!tropical )storm", ss, perl = TRUE, ignore.case = TRUE)
# [1] FALSE  TRUE FALSE  TRUE  TRUE

然后定义你的列:
my_data$Is.Storm  <-  grepl("(?<!tropical )storm", my_data$Storm.Type,
                            perl = TRUE, ignore.case = TRUE)

关于regex - R 中的正则表达式,带有负向后视,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20153959/

相关文章:

正则表达式以重复模式捕获每个组的第一次出现

Java正则表达式包含搜索

javascript - AB1234567 的正则表达式

javascript - 如何编写正则表达式来获取不带双引号的文本?

从 r 中的 s3 中一个一个地读取文件

hgignore 文件中的正则表达式负向后视

JavaScript 正则表达式 - 尝试匹配 ( 5', 78' , 8 0')(90' +2') 中的所有数字,前面不带 +

javascript - 使用 Javascript 正则表达式在 url 末尾的下划线后显示数字

r - 使用read.table读取文本文件

r - 如何绘制堆积比例图?