使用re.findall匹配大写单词和缩写时正则返回额外空字符串问题
问题原因
你当前得到含空字符串元组的核心原因是正则中定义了两个独立的捕获组,用|分隔两个匹配分支时,每次匹配只会命中其中一个分支的捕获组,未命中的另一个组就会返回空值。而re.findall在正则存在多个捕获组时,会按元组返回所有捕获组的结果,最终就出现了你看到的输出格式。
解决方法
不需要修改匹配逻辑,只要调整分组属性即可:
- 方案1:把两个分支的捕获组改为非捕获组(在左括号后加
?:标记),此时正则没有显式捕获组,re.findall会直接返回整个匹配成功的字符串列表 - 方案2:将两个分支放在同一个公共捕获组中,仅保留一个捕获组也不会返回多余空值
修正后代码(方案1示例)
import re txt = "USA. U.S.A America." # 用?:标记非捕获组,取消两个分支的独立捕获逻辑 x = re.findall(r"(?:[A-Z][A-Za-z]+\.?)|(?:\b[A-Z](?:[.&]?[A-Z]){2,}\b)", txt) print(x)
运行输出
['USA.', 'U.S.A', 'America.']
内容的提问来源于stack exchange,提问作者vynabhnnqwxleicntw
相关产品推荐
相关产品推荐

