R正则表达式,用于匹配列/向量中用逗号分隔的部分

时间:2018-07-22 16:12:51

标签: r regex

  

此问题的原始标题为:R Regex for word boundary excluding space.它反映了我处理问题的方式。但是,这是对我的特定问题的更好解决方案。只要使用特定的分隔符来分隔“单元格”中的项目

这必须非常简单,但是我碰到了砖墙。 我有一个dataframe列,其中每个单元格(行)都是用逗号分隔的项目列表。我想找到具有特定项目的行。

df<-data.frame( nms=  c("XXXCAP,XXX CAPITAL LIMITED" , "XXX,XXX POLYMERS LIMITED, 3455" , "YYY,XXX REP LIMITED,999,XXX" ), 
        b = c('A', 'X', "T"))  
                             nms b
1     XXXCAP,XXX CAPITAL LIMITED A
2 XXX,XXX POLYMERS LIMITED, 3455 X
3    YYY,XXX REP LIMITED,999,XXX T

我想搜索包含项目XXX的行。第2行和第3行应匹配。第1行的字符串XXX是较大字符串的一部分,显然不应该匹配。

但是,由于第1行中的XXX由两边的空格隔开,所以我很难用\\b[[:<:]]过滤掉

grep("\\bXXX\\b",df$nms, value = F) #matches 1,2,3

当然最简单的方法是strsplit(),但我想避免这样做。欢迎任何有关性能的建议。

2 个答案:

答案 0 :(得分:2)

\b不起作用时,问题通常出在“整个单词”的定义上。

word boundary可以出现在以下三个位置之一:

  • 如果字符串中的第一个字符是单词字符,则在字符串中第一个字符之前。
  • 如果字符串中的最后一个字符是单词字符,则在字符串的最后一个字符之后。
  • 字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。

似乎您只想在逗号或字符串的开头/结尾之间匹配一个单词。

您可以使用PCRE正则表达式(请注意perl=TRUE参数)

(?<![^,])XXX(?![^,])

请参见regex demo(由于该表达式是具有单个多行字符串的演示,因此该表达式已“转换为”以使用正视环法。)

详细信息

  • (?<![^,])(等于(?<=^|,))-字符串开头或逗号
  • XXX-一个XXX
  • (?![^,])(等于(?=$|,))-字符串结尾或逗号

R演示

> grep("(?<![^,])XXX(?![^,])",df$nms, value = FALSE, perl=TRUE)
## => [1] 2 3

等效的TRE正则表达式如下

> grep("(?:^|,)XXX(?:$|,)",df$nms, value = FALSE)

请注意,此处non-capturing groups用于匹配字符串的开头或,(请参见(?:^|,))和字符串结尾或,(请参见({{ 1}})。

答案 1 :(得分:0)

这也许是一个简单化的解决方案,但是它适用于您提供的示例:

library(stringr)

df$nms %>%
  str_replace_all('\\s', '') %>% # Removes all spaces, tabs, newlines, etc
  str_detect('(^|,)XXX(,|$)')    # Detects string XXX surrounded by comma or beginning/end

[1] FALSE  TRUE  TRUE

此外,请看看RStudio在正则表达式上制作的this速查表-编写得非常好并且非常有用(我有疑问时会继续讲到它)。