正则表达式:将字符串中所有大写字符提取至单个捕获组
提取字符串中所有大写字母的解决方案
嘿,我来帮你搞定这个正则提取的问题~你的需求是把字符串里所有的大写字母(A-Z)都提取出来,不管它们中间夹了什么内容,最终按顺序保留这些大写字母对吧?你之前用[A-Z]+失效,是因为这个表达式只能匹配连续的大写字母块,遇到空格或者其他非大写字符就会停住,没法跳过这些内容去抓后面的大写字母。
最简洁的实现方式:全局匹配单个大写字母
完全不用搞否定前瞻这么复杂的东西,直接用全局匹配单个大写字母[A-Z],然后把所有匹配到的结果拼接起来就行,几乎所有主流的正则引擎(Python、JavaScript、Java这些)都支持这种方式:
举个Python的例子:
import re input_str = "XLarge XLarge Short XXL Short" # 提取所有大写字母并拼接成字符串 result = ''.join(re.findall(r'[A-Z]', input_str)) print(result) # 输出:XLXLSSXXLS
如果你的需求是按原单词分组提取(比如每个单词里的大写字母单独拼成一段,再用空格分隔),比如输入里的每个单词对应提取后是XL、XL、S、XXL、S,最终输出XL XL S XXL S,那可以先拆分单词再逐个处理:
import re input_str = "XLarge XLarge Short XXL Short" # 按空格拆分单词,每个单词提取大写字母后拼接,再用空格连接所有片段 grouped_result = ' '.join([''.join(re.findall(r'[A-Z]', word)) for word in input_str.split()]) print(grouped_result) # 输出:XL XL S XXL S
关于用否定前瞻实现的疑问
其实真的没必要用否定前瞻来做这件事,上面的方法简单直接,还容易维护。不过如果硬要试试用前瞻的写法(比如某些特殊场景要求用单个正则完成),也能写,但表达式会变得很绕,比如这样:
([A-Z])(?:[^A-Z]*([A-Z]))*
但这个写法需要多次捕获,还要把所有捕获组的内容拼接,反而不如全局匹配单个字母来得高效。所以真的不推荐用前瞻来解决这个问题~
总之,优先选择全局匹配单个大写字母再拼接的方案,完全能满足你的需求,还省心!
内容的提问来源于stack exchange,提问作者atoms
相关产品推荐
相关产品推荐

