加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

R正则表达式:grep不包括连字符/破折号作为边界

发布时间:2020-12-14 05:56:08 所属栏目:百科 来源:网络整理
导读:我试图在一个带有变量字符串的向量中匹配一个确切的单词.为此,我使用边界.但是,我想连字符/破折号不被视为单词边界.这是一个例子: vector-c( "ARNT","ACF,ASP,ACF64","BID","KTN1,KTN","NCRNA00181,A1BGAS,A1BG-AS","KTN1-AS1") 要匹配包含“KTN1”的字符串
我试图在一个带有变量字符串的向量中匹配一个确切的单词.为此,我使用边界.但是,我想连字符/破折号不被视为单词边界.这是一个例子:

vector<-c(    
"ARNT","ACF,ASP,ACF64","BID","KTN1,KTN","NCRNA00181,A1BGAS,A1BG-AS","KTN1-AS1")

要匹配包含“KTN1”的字符串,我正在使用:

grep("(?i)(?=.*bKTN1b)",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("bKTN1b(?!-)",KTN"

返回包含字符串KTN1后面没有连字符的元素.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读