You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 07:44:07