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

标签 r regex

The original Title for this Question was : R Regex for word boundary excluding space.It reflected the manner I was approaching the problem in. However, this is a better solution to my particular problem. It should work as long as a particular delimiter is used to separate items within a 'cell'

这一定很简单,但我却遇到了困难。 我有一个数据框列,其中每个单元格(行)都是逗号分隔的项目列表。我想找到包含特定项目的行。

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

I want to search for rows that have item XXX. Rows 2 and 3 should match. Row 1 has the string XXX as part of a larger string and obviously should not match.

However, because XXX in row 1 is separated by spaces in each side, I am having trouble filtering it out with \\b or [[:<:]]

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

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

最佳答案

何时 \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用于匹配字符串的开头或 , (参见 (?:^|,) )以及字符串的任一结尾或 , (参见((?:$|,)))。

关于R 正则表达式用于匹配列/向量中逗号分隔的部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51466957/

相关文章:

javascript - jQuery 解析 url 路径的一部分

javascript - 为什么带有全局标志的正则表达式会给出错误的结果?

Python:在文件中查找字符串

ruby - 带有 Puppet 的非法 rabbitmq 集群节点

R:如何替换 data.frame 的元素?

r - 在 Rstudio 的 RMarkdown 脚本中关闭和打开所有 block 功能

r - R中多个变量的条件合并

r - R 中可以有多行注释吗?

R tm StemCompletion 生成 NA 值

javascript - float 的正则表达式