【问题标题】:Ignore case in strsplit in R在 R 中忽略 strsplit 中的大小写
【发布时间】:2015-07-28 07:10:11
【问题描述】:

我知道在grep 中您可以简单地使用ignore.case = TRUE。但是,strsplit 呢?您可以将正则表达式作为第二个参数传递,但我不确定如何使此正则表达式不区分大小写。

目前,这就是我的 strsplit 的样子,但我想让搜索不区分大小写。我该怎么做?

strsplit(df$sentence, paste0(" ", df$node, "( |[!\",.:;?})\\]])"))

例子:

sentence <- "De A-bom, Sint..."; 
node <- "a-bom"

contexts <- strsplit(sentence, paste0("(?i) ", node, "( |[!\",.:;?})\\]])"))
(leftContext <- sapply(contexts, `[`, 1))

预期回报:

[1] "De"

实际回报:

[1] "De A-bom, Sint..."

但请注意,正则表达式本身 does work online.

【问题讨论】:

  • 字符串"( |[!\",.:;?})\\]])"中的所有字符都不取决于大小写。
  • @SvenHohenstein 不,但是 df$node 的内容可以。
  • 穴居人的解决方案是在应用 strsplit 之前在 sentence 上使用 tolower
  • 如果我理解了您的问题,与@RomanLuštrik 类似的想法是将句子替换为gsub(node, node, sentence, ignore.case=TRUE),这将删除相关文本的大小写问题,而不会更改其余部分的大小写句子。
  • 我认为您必须添加 perl=TRUE 参数。这和tolower 接近你想要的结果:strsplit(tolower(sentence), paste0("(?i) ", node, "( |[!\",.:;?})\\]])"),perl=TRUE)

标签: regex r case-sensitive strsplit


【解决方案1】:

“(?i)”模式修饰符确实使基于 PCRE 的正则表达式不区分大小写。

您的示例的问题不在于大小写,而在于分组表达式。将perl=TRUE 用于您预期的转义行为。

sentence <- "De A-bom, Sint..."; 
node <- "a-bom"

contexts <- strsplit(sentence, paste0("(?i) ", node, 
    "( |[!\",.:;?})\\]])"),perl=TRUE)
(leftContext <- sapply(contexts, `[`, 1))

产生预期的效果

[1] "De"

【讨论】:

  • 啊,这就是你的意思!但是,现在标点符号的“数组”(又是什么名字?)没有关闭,难道不是问题吗?在| 之后,我们用[ 打开,我们应该用] 关闭,但我们从来没有这样做过?
  • 我仍然不明白为什么我的在线 RegEx 可以正常工作,但在 R 中却不行。regex101.com/r/zU1fE7/2
  • 查看编辑,您需要 perl=TRUE 以获得所需的转义行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 2015-01-15
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 2011-08-26
相关资源
最近更新 更多