R grep由特殊字符分隔的整词
假设有一个序列向量,其形式为R grep由特殊字符分隔的整词,r,regex,R,Regex,假设有一个序列向量,其形式为“foo”或“foo | baz | bar”(一个单词或多个单词,由特殊字符分隔,如“|”),我们还得到了一个单词,我们希望找到该向量的哪些项与整个单词相匹配 例如,单词“foo”在“foo | baz | bar”中有一个完整的匹配项,但在“foobaz | bar”或“bazzoo”中都没有完整的匹配项 首先,我尝试使用“\\b”来指示整个单词的开始边缘或结束边缘,并成功地工作: grep("\\bfoo\\b", "foo") # match
“foo”
或“foo | baz | bar”
(一个单词或多个单词,由特殊字符分隔,如“|”
),我们还得到了一个单词,我们希望找到该向量的哪些项与整个单词相匹配
例如,单词“foo”
在“foo | baz | bar”
中有一个完整的匹配项,但在“foobaz | bar”
或“bazzoo”
中都没有完整的匹配项
首先,我尝试使用“\\b”
来指示整个单词的开始边缘或结束边缘,并成功地工作:
grep("\\bfoo\\b", "foo") # match
grep("\\bfoo\\b", "foobaz|bar") # mismatch
grep("\\bfoo\\b", "bazfoo") # mismatch
然后我尝试添加“|”
作为另一个可能的两端分隔符,并使用[
和]
将其与“\\b”
分组:
grep("[|\\b]foo[|\\b]", "foo|baz|bar") # mismatch!
grep("[|\\b]foo[|\\b]", "foo") # mismatch!
后来我发现\\b
不是字符串开头或结尾的指示符,而是整个单词的开头或结尾(许多字符如空格和,|-^.
但不是数字和下划线.
分隔整个单词)。所以“[|\\b]foo[|\\b]”
匹配所有这些字符串:“foo”、“foo | bar | baz”、“foo bar”、“baz foo | bar”
但不匹配“foo | bar”
或“foo2”
但是我的问题仍然存在:为什么
“[|\\b]foo[|\\b]”
模式与“foo”
不匹配?您可以使用strplit
:
> "foo" %in% unlist(strsplit("foo|baz|bar", split = "|", fixed = TRUE))
[1] TRUE
您可以将其矢量化:
> z <- c("foo|baz|bar", "foobaz|bar", "bazfoo")
> x <- c("foo", "foot")
> sapply(strsplit(z, split = "|", fixed = TRUE), function(x,y)y %in% x, x)
[,1] [,2] [,3]
[1,] TRUE FALSE FALSE
[2,] FALSE FALSE FALSE
>z x sapply(strsplit(z,split=“|”,fixed=TRUE),函数(x,y)y%在%x,x中)
[,1] [,2] [,3]
[1,]对错错错
[2,]错
您可以使用strplit
> "foo" %in% unlist(strsplit("foo|baz|bar", split = "|", fixed = TRUE))
[1] TRUE
您可以将其矢量化:
> z <- c("foo|baz|bar", "foobaz|bar", "bazfoo")
> x <- c("foo", "foot")
> sapply(strsplit(z, split = "|", fixed = TRUE), function(x,y)y %in% x, x)
[,1] [,2] [,3]
[1,] TRUE FALSE FALSE
[2,] FALSE FALSE FALSE
>z x sapply(strsplit(z,split=“|”,fixed=TRUE),函数(x,y)y%在%x,x中)
[,1] [,2] [,3]
[1,]对错错错
[2,]错
由于
在正则表达式中有特殊含义,因此需要对其进行转义,即使用\\\\\\
:
ptn <- "\\bfoo[\\|\\b]"
grep(ptn, "foo|baz|bar")
[1] 1
grep(ptn, "foo")
integer(0)
ptn由于\
在正则表达式中具有特殊含义,因此需要对其进行转义,即使用\\\\\\\
:
ptn <- "\\bfoo[\\|\\b]"
grep(ptn, "foo|baz|bar")
[1] 1
grep(ptn, "foo")
integer(0)
ptn这也可以:
gregexpr("foo|", "foo|baz|bar", fixed = TRUE)[[c(1, 1)]] > 0
gregexpr("foo|", "foobaz|bar", fixed = TRUE)[[c(1, 1)]] > 0
gregexpr("foo|", "bazfoo", fixed = TRUE)[[c(1, 1)]] > 0
这种方法的不同之处在于,您可以利用您提供的gregexpr
间距选项来查找由两个单词组成的单词:
gregexpr("foo|", "baz foo|", fixed = TRUE)[[c(1, 1)]] > 0
gregexpr(" foo|", "baz foo|", fixed = TRUE)[[c(1, 1)]] > 0
这也将有助于:
gregexpr("foo|", "foo|baz|bar", fixed = TRUE)[[c(1, 1)]] > 0
gregexpr("foo|", "foobaz|bar", fixed = TRUE)[[c(1, 1)]] > 0
gregexpr("foo|", "bazfoo", fixed = TRUE)[[c(1, 1)]] > 0
这种方法的不同之处在于,您可以利用您提供的gregexpr
间距选项来查找由两个单词组成的单词:
gregexpr("foo|", "baz foo|", fixed = TRUE)[[c(1, 1)]] > 0
gregexpr(" foo|", "baz foo|", fixed = TRUE)[[c(1, 1)]] > 0
\b在以下位置进行匹配
在字符串的第一个字符之前,如果第一个字符是单词字符李>
如果最后一个字符是单词字符,则在字符串中最后一个字符之后李>
在字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。(单词字符为a-zA-Z1-9)
因为|在正则表达式中代表交替运算符,所以您必须将其转义
因此正则表达式\bfoo\b
将匹配foo | bar
中的foo
,因为|是非单词字符。无需使用字符集[\b\|]
编辑:正如flodel在下面指出的那样\b在字符集中表示退格字符。因此它将匹配| inside[\b\|]而不是单词边界。\b在以下位置匹配
在字符串的第一个字符之前,如果第一个字符是单词字符李>
如果最后一个字符是单词字符,则在字符串中最后一个字符之后李>
在字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。(单词字符为a-zA-Z1-9)
因为|在正则表达式中代表交替运算符,所以您必须将其转义
因此正则表达式\bfoo\b
将匹配foo | bar
中的foo
,因为|是非单词字符。无需使用字符集[\b\|]
编辑:正如flodel在下面指出的那样\b在字符集中表示退格字符。因此,它将匹配| inside[\b\|]而不是单词边界。谢谢,但我更感兴趣的是,为什么grep(“[\b]foo[\b]”,“foo”)不匹配?因为你需要逃避
。出于同样的原因,我选择在strsplit
内部使用fixed=TRUE
。如果我只寻找“|”作为分隔符,\\b”不是一个好的选择,因此您的答案在这种情况下似乎更好。它在编程方面也很友好:正如您所看到的,创建正则表达式模式不需要难看的粘贴。谢谢flodel。你的答案很完美。我希望能够为这个问题选择3个正确答案——我甚至试过!谢谢,但我更感兴趣的是想知道为什么grep(“[|\\b]foo[|\\b],“foo”)不匹配?因为你需要逃避
。出于同样的原因,我选择在strsplit
内部使用fixed=TRUE
。如果我只寻找“|”作为分隔符,\\b”不是一个好的选择,因此您的答案在这种情况下似乎更好。它在编程方面也很友好:正如您所看到的,创建正则表达式模式不需要难看的粘贴。谢谢flodel。你的答案很完美。我希望能够为这个问题选择3个正确答案——我甚至试过!谢谢你的评论。我发现即使是“\\bfoo\\b”也能实现我的目标。你认为你的答案需要改进吗?@AliSharifi如果你想改进我的答案,请继续。我相信我已经回答了你的问题。这里有一些有趣的事情:grep(“afooa”,“afooa”)
给出了一个匹配。grep(“[a]foo[a]”,“afooa”)
也是如此。grep(“\\bfoo\\b”,“foo”)
也是如此,但不是grep([\\b]foo[\\b],“foo”)
。知道吗?我在这里找到了我问题的答案:。在字符类中,\b是退格字符。。所以这不是一个好方法。谢谢你的评论。我甚至发现“\\bfoo\\