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

Python中如何从右向左匹配A/B/C字符将字符串拆分为两部分

核心结论

Python内置的str.rpartition()方法不支持传入多个匹配字符参数,它仅接收单个分隔字符串作为入参,无法直接实现同时匹配A、B、C三个字符的拆分需求。

针对你要拆分末尾带A/B/C开头版本号的专利号场景,有两种高性价比实现方案,按需选择即可:


方案1:纯内置字符串方法实现(性能最优,无依赖)

直接用str.rfind()分别查找A、B、C三个字符在字符串中最靠右的出现位置,取位置最大值作为拆分点即可,所有逻辑都走Python内置C层面实现的字符串方法,性能最高:

def split_patent_num(number: str) -> tuple[str, str]:
    # 查找三个目标字符的最右位置,不存在则返回-1
    split_idx = max(number.rfind('A'), number.rfind('B'), number.rfind('C'))
    if split_idx == -1:
        # 无匹配版本号时的兜底逻辑,可根据业务需求调整
        return number, ''
    return number[:split_idx], number[split_idx:]

测试你的样例输出完全符合预期:

  • split_patent_num('EP3293036A1') → ('EP3293036', 'A1')
  • split_patent_num('US10661612B2') → ('US10661612', 'B2')
  • split_patent_num('CN107962948A') → ('CN107962948', 'A')
  • split_patent_num('ES15258411C1') → ('ES15258411', 'C1')

如果后续要新增匹配字符,只需要在max()里加对应的rfind('X')即可。


方案2:正则实现(扩展性最好,规则调整灵活)

如果后续版本号规则可能变复杂(比如要匹配多字符前缀、排除特殊位置的匹配),用正则的可维护性更高,短字符串场景下性能差距可以忽略:

import re

# 预编译正则提升重复调用性能
VERSION_PATTERN = re.compile(r'[ABC][^ABC]*$')

def split_patent_num(number: str) -> tuple[str, str]:
    match = VERSION_PATTERN.search(number)
    if not match:
        return number, ''
    split_idx = match.start()
    return number[:split_idx], number[split_idx:]

正则逻辑说明:[ABC]匹配A/B/C任意一个字符,[^ABC]*$匹配从该位置到字符串结尾、中间不再出现A/B/C的内容,天然定位到最靠右的版本号起始位置。如果后续要新增匹配字符,直接修改字符集[ABC]即可,比如加D就改成[ABCD]。


不推荐循环调用三次rpartition再筛选结果的实现,会产生多余的临时字符串拷贝,性能比直接取rfind最大值的方案差。

内容的提问来源于stack exchange,提问作者screensaver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 17:01:28