如何检测字符串中所有字母均为大写?(用于数据集章节标题筛选)
解决大写章节标题的筛选问题
你的问题出在正则表达式的范围限定上——原正则只匹配连续的大写字母,但目标标题里包含空格和撇号,自然匹配失败啦。咱们一步步调整:
问题分析
原代码里的^[[:upper:]]{2,}+$有两个明显问题:
- 只允许纯大写字母,没包含标题里常见的空格和撇号(比如
THE QUEEN'S HAND里的空格和') {2,}+是冗余写法,{2,}已经表示“至少2个字符”
正确的正则表达式
根据你的需求(长度≥2、仅含大写字母/撇号/空格,排除特殊符号),正确的正则应该是:
^[[:upper:] ']{2,}$
拆解一下规则:
^和$:锁定字符串的开头和结尾,确保整个内容都符合规则,不会出现“部分符合但带特殊符号”的漏网之鱼[[:upper:] ']:允许的字符集合——大写字母、空格、半角撇号(如果你的数据里有全角撇号’,就改成[[:upper:] '’],兼容两种写法){2,}:要求字符串总长度至少为2,直接排除单个I这类非章节内容
测试验证
咱们用你的例子逐一测试:
library(stringr) # 符合要求的匹配成功案例 str_detect("ARYA", "^[[:upper:] ']{2,}$") # 返回 TRUE str_detect("THE QUEEN'S HAND", "^[[:upper:] ']{2,}$") # 返回 TRUE # 需要排除的匹配失败案例 str_detect("I", "^[[:upper:] ']{2,}$") # 返回 FALSE(长度不足) str_detect("STOP THIS!", "^[[:upper:] ']{2,}$") # 返回 FALSE(含感叹号) str_detect("Hello World", "^[[:upper:] ']{2,}$") # 返回 FALSE(有小写字母)
结合dplyr批量筛选数据集
如果要在数据集中批量筛选目标章节标题,直接把正则放进filter函数即可:
library(dplyr) library(stringr) # 假设你的数据集是df,目标列名为chapter_title filtered_df <- df %>% filter(str_detect(chapter_title, "^[[:upper:] ']{2,}$"))
额外说明
如果你的需求里真的不允许空格(但和你给出的例子矛盾),只需要把正则里的空格去掉,改成^[[:upper:]']{2,}$就行——不过这样THE QUEEN'S HAND会被排除,建议根据实际数据调整字符集合。
内容的提问来源于stack exchange,提问作者Evan O.
相关产品推荐
相关产品推荐

