我试图在一个带有变量字符串的向量中匹配一个确切的单词.为此,我使用边界.但是,我想连字符/破折号不被视为单词边界.这是一个例子:
vector<-c( "ARNT","ACF,ASP,ACF64","BID","KTN1,KTN","NCRNA00181,A1BGAS,A1BG-AS","KTN1-AS1")
要匹配包含“KTN1”的字符串,我正在使用:
grep("(?i)(?=.*\\bKTN1\\b)",vector,perl=T)
但这匹配“KTN1”和“KTN1-AS1”.
有没有办法可以将短划线视为一个角色,以便“KTN1-AS1”被认为是一个完整的单词?
解决方法
要匹配vector元素中的特定单词,需要使用regmatches,str_extract_all(来自stringr包)等函数而不是grep,因为grep只返回找到匹配项的元素索引.
> vector<-c( + "ARNT",+ "ACF,+ "BID",+ "KTN1,+ "NCRNA00181,+ "KTN1-AS1") > regmatches(vector,regexpr("(?i)\\bKTN1[-\\w]*\\b",perl=T)) [1] "KTN1" "KTN1-AS1"
要么
> library(stringr) > unlist(str_extract_all(vector[grep("(?i)\\bKTN1[-\\w]*\\b",vector)],perl("(?i).*\\bKTN1[-\\w]*\\b"))) [1] "KTN1" "KTN1-AS1"
更新:
> grep("\\bKTN1(?=$|,)",perl=T,value=T) [1] "KTN1,KTN"
返回包含字符串KTN1后跟逗号或行尾的元素.
要么
> grep("\\bKTN1\\b(?!-)",KTN"
返回包含字符串KTN1后面没有连字符的元素.