如何使用TidyText提取文本中括号包裹的短语?
解决TidyText提取带括号元素的问题
你之前用unnest_regex没得到想要的结果,核心原因是这个函数的pattern参数是用来分隔文本的规则,而非匹配你要提取的目标内容。之前的正则会把文本按括号内容拆分,最终得到的是拆分后的剩余部分,自然不是你需要的带括号元素。
用以下代码可以实现你的需求:
library(tidytext) library(stringr) library(tidyr) df <- data.frame( text = c( "[instruction] [Mortgage][Show if Q1A5]Mortgage Loans", "[checkboxes] [min 1] [max OFF] [Show if Q29A2] Please indicate the reason(s) you would not purchase this check package." ), line = c(1,2) ) # 提取所有带[]的元素并展开成行 result <- df %>% mutate(elements = str_extract_all(text, "\\[.*?\\]")) %>% # 匹配所有[xxx]格式的内容 unnest_longer(elements) %>% # 把列表列展开为多行 select(line, elements) # 保留需要的列 head(result)
运行后会得到你预期的输出:
# A tibble: 6 × 2 line elements <dbl> <chr> 1 1 [instruction] 2 1 [Mortgage] 3 1 [Show if Q1A5] 4 2 [checkboxes] 5 2 [min 1] 6 2 [max OFF]
关键说明:
str_extract_all(text, "\\[.*?\\]"):用正则匹配所有以[开头、]结尾的最短内容(.*?是非贪婪匹配,避免把多个连续的括号内容当成单个匹配项),每个文本里的匹配结果会被存为一个列表。unnest_longer(elements):把列表类型的列拆分成多行,让每个匹配项单独占据一行。
内容的提问来源于stack exchange,提问作者maijuli
相关产品推荐
相关产品推荐

