You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言grepl函数中OR运算符后换行为何会改变正则匹配结果?

问题原因

你遇到的差异本质是R的字符串字面量会保留引号内的所有空白字符:当你把Tumoral挪到引号内的新行时,|和Tumoral之间多了换行符+行首的缩进空格,原来的正则片段|Tumoral变成了|\n Tumoral,相当于你要求匹配的内容必须是「竖线+换行+若干空格+Tumoral」才会命中,原本纯Tumoral的内容就无法匹配,所以最终匹配成功的行数少了3条,和你运行结果的差值完全对应。

正确的换行写法

给你两种常用的无副作用换行方案:

方案1:用paste0拼接正则片段

把每个分支拆成独立的字符串拼接,不会引入多余空白:

# 逐段拼接正则,换行自由无额外空白
oncologie_pattern <- paste0(
  "Radioth[ée]rapie|",
  "Chimioth[ée]rapie|",
  "Radiochimioth[ée]rapie|",
  "Cancer|",
  "Tumeur|",
  "Tumoral"
)

sigaps$Oncologie <- ifelse(
  grepl(oncologie_pattern, sigaps$Titre.de.l.étude, ignore.case = TRUE),
  1,
  0
)

方案2:开启正则注释模式忽略空白

用base R的regex()函数开启comments = TRUE参数,该模式下正则内的所有空白、换行和#开头的注释都会被自动忽略,你可以自由换行排版:

oncologie_pattern <- regex(
  "
  Radioth[ée]rapie|
  Chimioth[ée]rapie|
  Radiochimioth[ée]rapie|
  Cancer|
  Tumeur|
  Tumoral
  ",
  ignore_case = TRUE,
  comments = TRUE # 关键参数:自动忽略正则内的空白和注释
)

sigaps$Oncologie <- ifelse(
  grepl(oncologie_pattern, sigaps$Titre.de.l.étude),
  1,
  0
)
补充说明

这不是逻辑层面的编码错误,属于R字符串语法的常见小坑,只要记住引号内的所有字符都会被当做字符串的一部分,不要在需要精确匹配的字符串内插入不必要的换行、缩进即可。

内容的提问来源于stack exchange,提问作者Seydou GORO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:54:02