如何在R中用Regex提取小写单词与带大括号的单词?
在R中用正则提取小写单词和带大括号的单词
问题背景
需要从数据框的word列中提取两类内容:纯小写单词(如sp)、带大括号的单词(如{PPC}),排除全大写单词、单个大写字母、带撇号的大写衍生词(如'EM)等。
示例数据
file word 1 sp 2 WHAT 3 ISN' 4 'EM 5 O 6 {PPC}
预期结果
"sp", "{PPC}"
现有代码及问题
原代码尝试通过反向匹配排除大写和数字,但逻辑存在漏洞:
unique(full_dat$word[!grepl("^[A-Z].*[A-Z]|\\d", full_dat$word) & !grepl(" [[:punct:]] ", full_dat$word)])
运行后结果仍包含单个大写字母(如O、I)、带撇号的大写衍生词(如'EM)等不符合要求的内容。
解决方案
直接正向匹配符合要求的两类内容,避免反向匹配的漏洞:
修改后代码
# 提取符合要求的单词并去重,同时排除NA unique(full_dat$word[!is.na(full_dat$word) & grepl("^[a-z']+$|^\\{.*\\}$", full_dat$word, perl = TRUE)])
正则逻辑解释
正则表达式^[a-z']+$|^\\{.*\\}$分为两部分,用|(或)连接:
^[a-z']+$:匹配纯小写字母+撇号组成的单词(比如sp、don't),^和$确保匹配整个单词,避免部分匹配^\\{.*\\}$:匹配以{开头、以}结尾的单词(比如{PPC}、{GAP_ANONYMIZATION_NAME}),\\是转义符,因为{}在正则里是特殊字符
效果验证
用示例数据测试,会得到预期的"sp", "{PPC}",同时过滤掉所有不符合要求的内容。
内容的提问来源于stack exchange,提问作者aoooooiiiiiiiiiiiiiii
相关产品推荐
相关产品推荐

