簡體   English   中英

R正則表達式:grep不包括連字符/破折號作為邊界

[英]R regex: grep excluding hyphen/dash as boundary

我試圖在一個帶有變量字符串的向量中匹配一個確切的單詞。 為此,我使用邊界。 但是,我想連字符/破折號不被視為單詞邊界。 這是一個例子:

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元素中的特定單詞,需要使用regmatchesstr_extract_all (來自stringr包)等函數而不是grep,因為grep只返回找到匹配項的元素索引。

> vector<-c(    
+     "ARNT",
+     "ACF, ASP, ACF64",
+     "BID",
+     "KTN1, KTN",
+     "NCRNA00181, A1BGAS, A1BG-AS",
+     "KTN1-AS1")
> regmatches(vector, regexpr("(?i)\\bKTN1[-\\w]*\\b", vector, 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(?=$|,)", vector, perl=T, value=T)
[1] "KTN1, KTN"

返回包含字符串KTN1后跟逗號或行尾的元素。

要么

> grep("\\bKTN1\\b(?!-)", vector, perl=T, value=T)
[1] "KTN1, KTN"

返回包含字符串KTN1后面沒有連字符的元素。

我會保持這個簡單並創建一個DIY邊界。

grep('(^|[^-\\w])KTN1([^-\\w]|$)', vector, ignore.case = TRUE)

我們使用捕獲組來定義邊界。 我們匹配一個不是連字符或單詞字符的字符 - 字符串的開頭或結尾,它更接近\\b邊界的意圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM