R 具有固定(文字)字符的矢量化字符串

R 具有固定(文字)字符的矢量化字符串,r,string,stringr,tidyverse,R,String,Stringr,Tidyverse,我有以下代码,我希望能给我一个3个元素的列表,因为文本中有3个元素: library(stringr) texts <- c("I doubt it! :)", ";) disagree, but ok.", "No emoticons here!!!") smileys <- c(":)","(:",";)",":D") str_extract_all(texts, fixed(smileys)) 这要好得多,因为它给了我一个由3个元素组成的列表,但每个元素又是由4个元素组成的列

我有以下代码,我希望能给我一个3个元素的列表,因为
文本中有3个元素:

library(stringr)
texts <- c("I doubt it! :)", ";) disagree, but ok.", "No emoticons here!!!")
smileys <- c(":)","(:",";)",":D")
str_extract_all(texts, fixed(smileys))
这要好得多,因为它给了我一个由3个元素组成的列表,但每个元素又是由4个元素组成的列表

我想得到的是一个3个尽可能少嵌套的列表。某个地方的某个人已经解决了这个问题,但我一辈子都搞不懂,也弄不懂如何用谷歌搜索。我可以为此做一个循环,但我认为自己是TydErth.T.P/>的公民。
感谢您的帮助。

您可以使用
粘贴
笑脸的每个元素用
\\Q
\\E
包装起来,并在正则表达式或“元字符(
)上折叠以形成一个模式。如《stringi
手册》和《stringi
手册》中所述,
\\Q
\\E
之间的字符按字面解释

pattern <- paste("\\Q", smileys, "\\E", sep = "", collapse = "|")
# [1] "\\Q:)\\E|\\Q(:\\E|\\Q;)\\E|\\Q:D\\E"

library(stringi)
stri_extract_all_regex(texts, pattern)
#[[1]]
#[1] ":)"
#
#[[2]]
#[1] ";)"
#
#[[3]]
#[1] NA
如果您确实想使用
purr
并避免使用正则表达式,一个想法是这样的:

library(purrr)
library(stringr)
texts %>% 
  map(~ unlist(str_extract_all(.x, fixed(smileys))))
#[[1]]
#[1] ":)"
#
#[[2]]
#[1] ";)"
#
#[[3]]
#character(0)  
       # if you want NA, not a zero-length vector, you could add:
       # %>% map(~ ifelse(is.character(.x) & length(.x) == 0L, NA, .x))

不熟悉stringr,但我相信您可能已经看过了。如果你追求“<代码>粘贴>代码>代码>塌陷=<代码> >方法,那么你可能需要考虑不确定这是否是你要找的,但是你可以尝试这样的事情:<代码>模式,是的,只是用管道把东西粘贴在一起,就是我必须从所有括号、冒号等中逃脱出来,这构成了很多笑脸!被指控有罪,@Jota!在评论之前我没有试过。你的解决方案很有魅力!请随意将其作为答案发布,我会将其标记为正确。@Joy我提供的第二个链接中描述了
Q
/
E
方法。
regmatches(texts, gregexpr(pattern, texts))
#[[1]]
#[1] ":)"
#
#[[2]]
#[1] ";)"
#
#[[3]]
#character(0)  
       # If you want an NA, instead of a zero-length vector, 
       # then you could do something like:
       # lapply(
       #   regmatches(texts, gregexpr(pattern, texts)), 
       #   function(ii) ifelse(is.character(ii) & length(ii) == 0L, NA, ii))
library(purrr)
library(stringr)
texts %>% 
  map(~ unlist(str_extract_all(.x, fixed(smileys))))
#[[1]]
#[1] ":)"
#
#[[2]]
#[1] ";)"
#
#[[3]]
#character(0)  
       # if you want NA, not a zero-length vector, you could add:
       # %>% map(~ ifelse(is.character(.x) & length(.x) == 0L, NA, .x))