仅仅在没有与R中的其他部分匹配的情况下专门地“覆盖”“SN”,“+ SN”或“-SN”

时间:2015-03-19 00:49:21

标签: r grep

所以我正在尝试grep来自“天气状况”列的天气数据,该列具有针对不同天气类型的多个指标。我试图分别“+ SN”,“SN”和“-SN”,但是我很难避免部分匹配。

以下是要插入的列中可能包含的内容的示例:

c("-SN", " ", "SN FR", "HZ +SN", "SN", "+SN", " ", "+BC -SN")

Grepping“-SN”很好,但是grepping“+ SN”很棘手,因为+是一个正则表达式运算符本身。使用转义字符会给我以下错误:

> grep( "\+SN" ,aa) Error: '\+' is an unrecognized escape in character string starting ""\+"

此外,在没有获得“+ SN”或“-SN”的情况下轻击“SN”是一项挑战。正如您所看到的,我无法使用^SN$^SN排除+或 - 符号,因为一列中可能有多个指标,我正在寻找的指标可能位于前面或后面另一个指标。 R中的grep是否有!=-v等价物?你会怎么样这样的? R中的正则表达式在功能上似乎更有限。

感谢。

1 个答案:

答案 0 :(得分:5)

您需要使用基于负面外观的正则表达式。

> x <- c("-SN", " ", "SN FR", "HZ +SN", "SN", "+SN", " ", "+BC -SN")
> regmatches(x, regexpr("(?<!\\S)[-+]?SN(?!\\S)", x, perl=TRUE))
[1] "-SN" "SN"  "+SN" "SN"  "+SN" "-SN"

(?<!\\S)断言匹配不会以非空格字符开头。

OR

按顺序使用锚点来进行精确的字符串匹配。

> x <- c("-SN", " ", "SN FR", "HZ +SN", "SN", "+SN", " ", "+BC -SN")
> regmatches(x, regexpr("^[-+]?SN$", x))
[1] "-SN" "SN"  "+SN"

OR

> grep("^[-+]?SN$", x, value=TRUE)
[1] "-SN" "SN"  "+SN"

OR

单独SN SN+之前没有-> x <- c("-SN", " ", "SN FR", "HZ +SN", "SN", "+SN", " ", "+BC -SN") > regmatches(x, regexpr("(?<![+-])SN\\b", x, perl=TRUE)) [1] "SN" "SN"

{{1}}