【问题标题】:How to ignore case when using str_detect?使用 str_detect 时如何忽略大小写?
【发布时间】:2017-06-13 19:30:57
【问题描述】:

stringr 包提供了很好的字符串函数。

搜索字符串(忽略大小写)

可以使用

stringr::str_detect('TOYOTA subaru',ignore.case('toyota'))

这可行,但会发出警告

请使用 (fixed|coll|regex)(x, ignore_case = TRUE) 而不是 ignore.case(x)

改写的正确方法是什么?

【问题讨论】:

  • 考虑一个喜欢避免正则表达式魔法的用户

标签: r stringr


【解决方案1】:

您可以使用regex(或@lmo 评论中建议的fixed,具体取决于您的需要)函数来制作?modifiers 或?str_detect 中详述的模式(请参阅模式参数说明)

library(stringr)
str_detect('TOYOTA subaru', regex('toyota', ignore_case = T))
# [1] TRUE

【讨论】:

  • 或使用fixed:str_detect('TOYOTA subaru', fixed('toyota', ignore_case=TRUE))
  • 我喜欢这个问题简单明了,答案简单明了。难得的享受!
  • 目前,我在“1.4.0”处使用 stringr 得到 FALSE 输出。
【解决方案2】:

搜索字符串必须在函数fixed 内,并且该函数具有有效参数ignore_case

str_detect('TOYOTA subaru', fixed('toyota', ignore_case=TRUE))

【讨论】:

  • 奇怪的是,为什么我从 'regex' 得到 FALSE 输出,两者有什么区别?
【解决方案3】:

您可以使用(?i) 节省一点打字时间:

c("Toyota", "my TOYOTA", "your Subaru") %>% 
  str_detect( "(?i)toyota" )
# [1]  TRUE  TRUE FALSE

【讨论】:

  • 这是单个和多个搜索词的最佳答案。例如,str_detect(X, (?i)cws|usgs|fws)
  • 我经常将它与str_subset() 一起使用。它为我节省了很多打字时间。
  • (?i) 也可以与data.table %like% 运算符一起用于不区分大小写的搜索。或者您可以只使用专门为不区分大小写搜索而设计的%ilike% 运算符。
  • '(?i)' 是原始正则表达式中的一种方式吗?
【解决方案4】:

您可以使用基本 R 函数 grepl() 来完成相同的事情,而无需嵌套函数。它只是接受ignore.case 作为参数。

grepl("toyota", 'TOYOTA subaru', ignore.case = TRUE)

(注意前两个参数(模式和字符串)的顺序在greplstr_detect之间切换)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    相关资源
    最近更新 更多