2016-04-28 147 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