R语言中sub正则无法保留首个" - "前内容的问题排查
解决R中提取字符串第一个" - "前内容的问题
问题原因
你遇到的差异源于R默认使用BRE(基本正则表达式)引擎,而regex101默认使用PCRE(Perl兼容正则表达式)引擎,两者匹配行为存在细微差异;若输入中存在特殊空白字符(如非断空格),也会导致默认正则匹配不符合预期。
解决方案
方案1:固定字符串分割(最可靠)
直接按-(空格+横杠+空格)固定分割字符串,取第一部分,完全规避正则匹配的歧义:
authors <- sapply(strsplit(authors, " - ", fixed = TRUE), `[`, 1)
fixed=TRUE:指定按固定字符串分割,而非正则模式,不会误匹配姓名中的连字符(如Berrang-Ford)sapply(...,[, 1):对每个分割后的列表元素取第一部分
方案2:启用PCRE正则引擎
若坚持用正则,通过perl=TRUE参数切换到PCRE引擎,确保匹配逻辑与regex101一致:
# 方法A:沿用原正则逻辑 authors <- sub("\\s-\\s.*", "", authors, perl = TRUE) # 方法B:非贪婪匹配明确捕获目标部分 authors <- sub("^(.*?)\\s-\\s.*", "\\1", authors, perl = TRUE)
perl=TRUE:启用PCRE引擎,对齐regex101的匹配行为.*?:非贪婪匹配,确保只捕获到第一个\\s-\\s之前的内容
验证结果
两种方案处理后,均可得到预期输出:
[1] "T Dietz, RL Shwom, CT Whitley" [2] "L Berrang-Ford, JD Ford, J Paterson" [3] "CD Thomas"
内容的提问来源于stack exchange,提问作者Shmilft
相关产品推荐
相关产品推荐

