如何在R中提取混合中英文本的指定类别内容(含换行替换)
解决方法
可以借助stringr包的正则匹配功能实现需求,以下是两种可行方案:
方案一:先预处理Class4换行,再提取各分类
- 先把Class4区块内的换行替换成逗号:
library(stringr) # 替换Class4到Class5之间的换行为逗号 a_processed <- str_replace_all(a, "(?<=Class4:)(.*?)(?=\\nClass5:)", function(x) str_replace_all(x, "\\n", ","))
- 提取各个Class的内容:
Class1 <- str_extract(a_processed, "(?<=Class1:).*?(?=\\nClass2:)") Class2 <- str_extract(a_processed, "(?<=Class2:).*?(?=\\nClass3:)") Class3 <- str_extract(a_processed, "(?<=Class3:).*?(?=\\nClass4:)") Class4 <- str_extract(a_processed, "(?<=Class4:).*?(?=\\nClass5:)") Class5 <- str_extract(a_processed, "(?<=Class5:).*")
方案二:单独提取并处理Class4
- 先提取Class1、Class2、Class3和Class5:
Class1 <- str_extract(a, "(?<=Class1:).*?(?=\\nClass2:)") Class2 <- str_extract(a, "(?<=Class2:).*?(?=\\nClass3:)") Class3 <- str_extract(a, "(?<=Class3:).*?(?=\\nClass4:)") Class5 <- str_extract(a, "(?<=Class5:).*")
- 提取Class4原始内容并替换换行:
Class4_raw <- str_extract(a, "(?<=Class4:).*?(?=\\nClass5:)") Class4 <- str_replace_all(Class4_raw, "\\n", ",")
验证结果
运行代码后得到的结果与预期完全一致:
> Class1 [1] "AAA_123_视物。" > Class2 [1] "BBB_456,行手术。" > Class3 [1] "CCC_789" > Class4 [1] "DDD_111,EEE_222,FFF_333" > Class5 [1] "GGG_444_右:光感? "
原方法失败原因
- 用
ex_between(a, 'Class4:', '\n')只能提取到DDD_111,因为第一个换行就终止了匹配,但Class4的内容跨了多个换行,直到Class5才结束。 - Class5的匹配用
ex_between(a, 'Class1:', ' ')完全错误,起始标识选成了Class1,逻辑完全不对。
内容的提问来源于stack exchange,提问作者zhiwei li
相关产品推荐
相关产品推荐

