如何用Python正则表达式提取特定字符串中的宝可梦名称
使用正则表达式提取宝可梦名称的解决方案
当然可以用正则表达式搞定这个需求!这种方法完全不需要维护固定的宝可梦列表,能自动适配你提到的所有格式变体,包括边缘案例里带空格的宝可梦名称。
正则表达式设计思路
我们需要匹配的模式核心是:百分比(可选带for) + 首字母大写的宝可梦名称 + 分隔符(逗号或&) + 另一组百分比(可选带for) + 第二个宝可梦名称。对应的正则表达式如下:
import re pattern = r'(?:\d+% ?(?:for )?)?([A-Z][a-zA-Z ]+)(?:,|&)\s*(?:\d+% ?(?:for )?)?([A-Z][a-zA-Z ]+)'
正则各部分拆解:
(?:\d+% ?(?:for )?)?:非捕获组,匹配百分比数字(比如95%),后面可能跟着空格和for,整个组加问号表示这部分是可选的(覆盖像99% Diglett这种没有for的情况)([A-Z][a-zA-Z ]+):捕获组,提取宝可梦名称——要求首字母大写,后面可以跟任意字母或空格(完美适配Pika Pika Pikachu这种带空格的名称)(?:,|&):非捕获组,匹配两种分隔符:逗号或者&\s*:匹配分隔符后面的任意空格,兼容格式里的空格差异- 后半部分重复前半部分的结构,捕获第二个宝可梦名称
完整代码示例
把你的所有测试字符串放进去,运行即可提取每组的两个宝可梦名称:
import re # 测试字符串集合 str1 = '95% for Pikachu, 92% for Sandshrew' str2 = '70% for Paras & 100% Arcanine' str3 = '99% Diglett, 40% Dugtrio' str4 = '10% Squirtle, 100% for Alakazam' str5 = '30% Metopod & 99% Dewgong' edge_str = '100% for Pikachu, 29% Pika Pika Pikachu' str_list = [str1, str2, str3, str4, str5, edge_str] pattern = r'(?:\d+% ?(?:for )?)?([A-Z][a-zA-Z ]+)(?:,|&)\s*(?:\d+% ?(?:for )?)?([A-Z][a-zA-Z ]+)' for s in str_list: match = re.match(pattern, s) if match: print([match.group(1).strip(), match.group(2).strip()])
运行结果
执行上面的代码会输出:
['Pikachu', 'Sandshrew'] ['Paras', 'Arcanine'] ['Diglett', 'Dugtrio'] ['Squirtle', 'Alakazam'] ['Metopod', 'Dewgong'] ['Pikachu', 'Pika Pika Pikachu']
对比原有方案的优势
相比你原来依赖宝可梦列表匹配的方法,正则方案:
- 无需维护宝可梦名称列表,新增任何宝可梦都能自动识别
- 兼容所有格式变体:有没有
for、分隔符是逗号还是&、名称带空格的边缘情况 - 代码更简洁,逻辑更清晰
内容的提问来源于stack exchange,提问作者jayko03
相关产品推荐
相关产品推荐

