2015-03-19 55 views
0

因此,我正在嘗試從「天氣狀況」欄中獲取grep天氣數據,該列有多個天氣類型的指示器。我正在嘗試grep「+ SN」,「SN」和「-SN」,但難以避免部分匹配。在沒有部分匹配的情況下完全匹配「SN」,「+ SN」或「-SN」

下面就來grepped的可能是什麼列一個例子:

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 ""\+"

Futhermore,grepping「SN」沒有得到「+ SN」或「-SN」是構成挑戰。正如您所看到的,我無法使用^SN$^SN來排除+或 - 符號,因爲一列中可能有多個指標,而我正在查找的指標可能在前面或在另一個指標後面。 R中是否存在與grep等效的!=-v?你會怎麼想這樣的事情? R中的正則表達式在功能上似乎更受限制。

謝謝。

+0

什麼是你期望的輸出之前? – 2015-03-19 01:03:46

+0

@AvinashRaj我在使用grep()選擇天氣狀況爲「-SN」,「SN」或「+ SN」時的天氣觀測,所以它會出現在子集表達式中,如'df [grep(「 - SN「,df $ col),]'。我只是在grep部分遇到困難。 – ethane 2015-03-19 01:10:42

+0

至於'+',我認爲你需要逃避escape char,即'grep('\\ + SN',aa)',對於普通的'SN',搜索一個以'SN開頭的字符串''或者有一個空格字符後跟'SN':'grep('(^ SN | \\ sSN)',aa)'。看[這裏的例子](http://www.r-fiddle.org/#/fiddle?id=SD2ksmB6&version=1)。 – 2015-03-19 01:11:23

回答

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" 
+0

我實際上希望grep「SN」,「-SN」和「+ SN」在3個不同的語句中獨佔(即對於一個語句,我想grep SN而不是「-SN」或「+ SN」)。然而,我沒有意識到'grep'有一個'perl'參​​數,這可能會讓我grep我需要! – ethane 2015-03-19 01:13:51

+1

OMG,我仍然不知道你的預期輸出是什麼,在那裏添加了答案。希望能幫助到你。 '也就是說,對於一個聲明,我想grep SN而不是「-SN」或「+ SN」)「你能解釋爲什麼嗎? – 2015-03-19 01:15:54