Python正则如何拆分无分隔符拼接字符串并提取所有匹配项
Python正则提取无分隔符拼接球队名方案
原正则失效原因
([A-Z0-9].*s)*([A-Z].*)+无法得到正确结果,核心问题有两个:
- 模式中
.*为贪婪匹配规则,默认匹配尽可能长的符合条件的字符串,不会在第一个s[A-Z]分割点停止,直接将多个连续队名吞入同一个捕获组 - 未使用零宽断言标记分割位置,将下一个队名的首字母(大写)作为当前匹配段的边界,无法循环切分所有队名片段
正确正则实现
完全匹配预设的分割逻辑,同时兼容带空格的队名场景,正则写法如下:
import re pattern = r'[A-Z0-9].*?s(?=[A-Z])|[A-Z0-9].*$'
规则说明
- 第一个匹配分支
[A-Z0-9].*?s(?=[A-Z]):匹配从大写/数字开头,到s结束的片段;用.*?非贪婪匹配保证只匹配到最近的符合条件的s;正向先行断言(?=[A-Z])用来判断s后面紧跟大写字母(即到达队名分割点),且不会消耗这个大写字母,留给下一段匹配 - 第二个匹配分支
[A-Z0-9].*$:匹配最后一个队名,从剩余片段的大写/数字开头一直匹配到字符串末尾 - 两个分支顺序不能调换,否则会提前匹配完所有剩余内容,导致分割失效
测试验证
对所有给定示例做测试:
test_cases = [ 'RangersIslandersDevils', '49ersRaiders', 'Avalanche', 'Red Wings', 'RangersIslandersMolsDevil' ] for case in test_cases: print(re.findall(pattern, case))
运行输出完全符合预期:
['Rangers', 'Islanders', 'Devils'] ['49ers', 'Raiders'] ['Avalanche'] ['Red Wings'] ['Rangers', 'Islanders', 'Mols', 'Devil']
注:该正则严格遵循给定的分割规则,如果后续存在队名本身包含
s后紧跟大写字母的特殊场景,需要额外补充队名字典做校验修正。
内容的提问来源于stack exchange,提问作者meteque
相关产品推荐
相关产品推荐

