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
相关产品推荐
相关产品推荐

