此问题的原始标题为:
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()
,但我想避免这样做。欢迎任何有关性能的建议。
答案 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速查表-编写得非常好并且非常有用(我有疑问时会继续讲到它)。