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
相关产品推荐
相关产品推荐

