2016-04-28 144 views
1

嗨,我有以下數據。在R中匹配特殊字符

shopping_list <- c("apples x4", "bag of flour", "bag of sugar", "milk x2", 
        "appple+20gfree", 
        "BELI HG MSWAT ALA +VAT T 100g BAR WR", 
        "TOOLAIT CASSE+LSST+SSSRE 40g SAC MDC") 

在我的第二步中,我刪除了shopping_list中的所有空格。

require(stringr) 
shopping_list_trim <- str_replace_all(shopping_list, fixed(" "), "") 
print(shopping_list_trim) 
[1] "applesx4" "bagofflour" "bagofsugar"    
[4] "milkx2" "appple+20gfree" "BELIHGMSWATALA+VATT100gBARWR" 
[7] "TOOLAITCASSE+LSST+SSSRE40gSACMDC" 

如果我想提取不包含加號的字符串,我使用下面的代碼。

str_extract(shopping_list_trim, "^[^+]+$") 
[1] "applesx4" "bagofflour" "bagofsugar" "milkx2" NA NA NA  

想幫助提取包含加號的字符串。 我想輸出是以下一個。

NA NA NA NA "appple+20gfree" 
"BELIHGMSWATALA+VATT100gBARWR" "TOOLAITCASSE+LSST+SSSRE40gSACMDC" 

有沒有人有想法如何提取只包含加號的字符串?

+0

'grepl( 「(?=。* \\ +)」,shopping_list_trim,PERL = T)' – rock321987

回答

1

這將這樣的伎倆

> str_extract(shopping_list_trim, "^(?=.*\\+)(.+)$") 
[1] NA         
[2] NA         
[3] NA         
[4] NA         
[5] "appple+20gfree"     
[6] "BELIHGMSWATALA+VATT100gBARWR"  
[7] "TOOLAITCASSE+LSST+SSSRE40gSACMDC" 

正則表達式擊穿

^(?=.*\\+) #Lookahead to check if there is one plus sign 
(.+)$ #Capture the string if the above is true 
+0

關於正則表達式的這一部分'^(?=。* \\ +)'。 ?=的作用是什麼?字符? –

+0

@ssssssssssss它是一個向前看。它們的寬度爲零意味着它們不會消耗任何字符串。因此,基本上我們只是檢查字符串中是否存在「+」符號,而沒有在字符串中向前移動。 ?=)'是lookahead的語法.. ** [read](http://www.regular-expressions.info/lookaround.html)** – rock321987

+0

@ClasG給出的答案要簡單得多,如果你覺得它很複雜理解 – rock321987