在列表 R 中使用正则表达式查找连音词

Find hyphonated words with Regex in list R

我有一串以分号分隔的元素,我想查找模式是否与字符串中的任何元素匹配:

string <- "CPT1B;CPT1B;CPT1B;CHKB-CPT1B;CPT1B;CPT1B;CPT1B;CPT1B"

我想知道使用哪个正则表达式来匹配这些元素中的任何一个,我的意思是,如果任何元素与 "CPT1B" 匹配,我想得到 TRUE,为此我使用:

grepl(paste("[^;]","CPT1B,"[$;]",sep = ""),string)
TRUE

我使用了“[^;]”和“[$;]”,因为如果任何元素匹配,我想得到 TRUE。

当我尝试匹配 "CHKB-CPT1B" 时,我的问题来了,因为如果我使用相同的表达式:

grepl(paste("[^;]","CHKB-CPT1B","[$;]",sep = ""),string)
FALSE

我得到 FALSE,我认为这是由于单词中的连字符引起的,我想知道如何让 grepl 将连字符作为一个单词来读取单词。

我不想使用 "CHKB\-CPT1B",因为此模式将来自迭代器,该迭代器可以是连字符和非连字符的单词。而且我也不想将原始字符串拆分为“;”

您需要使用交替组:

grepl(paste0("(?:^|;)", "CPT1B", "(?:$|;)"),string)
[1] TRUE

(?:^|;) 非捕获组匹配字符串的开头或 ; 并且 (?:$|;) 匹配字符串的结尾或 ;

您也可以使用环视 perl=TRUE(即 PCRE 模式):

grepl(paste0("(?<![^;])", "CPT1B", "(?![^;])"),string, perl=TRUE)

这里,负向后视 (?<![^;]) 匹配紧接 ; 或字符串开头的任何位置,负向后视 (?![^;]) 要求下一个字符是 ; 或字符串位置的结尾。