【问题标题】:stringr: extract words containing a specific wordstringr:提取包含特定单词的单词
【发布时间】:2017-07-18 13:06:03
【问题描述】:

考虑这个简单的例子

dataframe <- data_frame(text = c('WAFF;WOFF;WIFF200;WIFF12',
                                 'WUFF;WEFF;WIFF2;BIGWIFF'))

> dataframe
# A tibble: 2 x 1
                      text
                     <chr>
1 WAFF;WOFF;WIFF200;WIFF12
2  WUFF;WEFF;WIFF2;BIGWIFF

这里我想提取包含WIFF的单词,也就是我想得到这样的数据框

> output
# A tibble: 2 x 1
            text
           <chr>
1 WIFF200;WIFF12
2  WIFF2;BIGWIFF

我尝试使用

dataframe %>% 
  mutate( mystring = str_extract(text, regex('\bwiff\b', ignore_case=TRUE)))

但这只会重新调整 NA。有什么想法吗?

谢谢!

【问题讨论】:

    标签: r regex stringr


    【解决方案1】:

    通过基础 R 的经典非正则表达式方法是,

    sapply(strsplit(me$text, ';', fixed = TRUE), function(i) 
                                  paste(grep('WIFF', i, value = TRUE, fixed = TRUE), collapse = ';'))
    
    #[1] "WIFF200;WIFF12" "WIFF2;BIGWIFF" 
    

    【讨论】:

      【解决方案2】:

      您似乎想删除所有包含WIFF 和结尾; 的单词(如果有的话)。使用

      > dataframedataframe <- data.frame(text = c('WAFF;WOFF;WIFF200;WIFF12', 'WUFF;WEFF;WIFF2;BIGWIFF'))
      > dataframe$text <- str_replace_all(dataframe$text, "(?i)\\b(?!\\w*WIFF)\\w+;?", "")
      > dataframe
                  text
      1 WIFF200;WIFF12
      2  WIFF2;BIGWIFF
      

      模式(?i)\\b(?!\\w*WIFF)\\w+;? 匹配:

      • (?i) - 不区分大小写的内联修饰符
      • \\b - 单词边界
      • (?!\\w*WIFF) - 如果单词在其中任何位置包含 WIFF,则否定前瞻将失败
      • \\w+ - 1 个或多个单词字符
      • ;? - 可选的;? 匹配它修改的模式的 1 或 0 次出现)

      如果出于某种原因您想使用str_extract,请注意您的正则表达式无法工作,因为\bWIFF\b matches a whole word WIFF 仅此而已。您的 DF 中没有这样的词。您可以使用"(?i)\\b\\w*WIFF\\w*\\b" 匹配内部带有WIFF 的任何单词(不区分大小写)并使用str_extract_all 来获得多个匹配项,并且不要忘记将匹配项连接到一个“字符串”中:

      > df <- data.frame(text = c('WAFF;WOFF;WIFF200;WIFF12', 'WUFF;WEFF;WIFF2;BIGWIFF'))
      > res <- str_extract_all(df$text, "(?i)\\b\\w*WIFF\\w*\\b")
      > res
      [[1]]
      [1] "WIFF200" "WIFF12" 
      
      [[2]]
      [1] "WIFF2"   "BIGWIFF"
      
      > df$text <- sapply(res, function(s) paste(s, collapse=';'))
      > df
                  text
      1 WIFF200;WIFF12
      2  WIFF2;BIGWIFF
      

      您可以通过将str_extract_all 放入sapply 函数来“缩小”代码,我将它们分开以获得更好的可见性。

      【讨论】:

      • 非常感谢 Wiktor。您似乎暗示替换不匹配的模式比提取匹配的模式更容易?为什么?
      • @Noobie:我没有这么说。由您决定什么更容易。
      • 我的意思是你的解决方案很棒,但你知道我的str_extract 根本不起作用吗?
      • @Noobie:我的逻辑很简单:如果您的字符向量包含“字符串”和“单词”,其中不一定有 WIFF,匹配方法意味着拆分/提取或匹配所有有效的匹配项然后加入他们。对我来说它看起来很麻烦(尽管这不是我写答案时的想法)。您的方法行不通,因为\bWIFF\b matches a whole word WIFF 仅此而已。你的 DF 中没有这样的词。
      • 我忘了让模式不区分大小写,现在添加了。
      猜你喜欢
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2015-04-01
      相关资源
      最近更新 更多