如何在Python中将字符串按特定字符从右向左分割?

3
什么是在Python中从右往左将字符串分割成两部分的最佳方法,直到出现其中的几个字符之一?
目标是将一个以版本号结尾(以A、B或C开头)的字符串分成两部分,例如:
EP3293036A1 -> EP3293036 + A1 US10661612B2 -> US10661612 + B2 CN107962948A -> CN107962948 + A ES15258411C1 -> ES15258411 + C1
我的代码可以用于拆分单个字符的字符串:
first_part = number.rpartition('A')[0]
second_part = number.rpartition('A')[1] + number.rpartition('A')[2]

有没有办法在使用rpartition时像('A' or 'B' or 'C')这样使用多个参数?或者是否可以使用正则表达式更好的方法?

3个回答

2
使用 re.findall 函数。使用所示的正则表达式,此函数提取括号内的部分: (.*?) - 任意字符重复0次或多次,非贪婪模式; ([AB]\d*)$ - A或B,后跟0个或多个数字,后跟字符串的结尾。
import re
lst = ['EP3293036A1', 'EP3293036B']

for s in lst:
    parts = re.findall(r'(.*?)([AB]\d*)$', s)
    print(f's={s}; parts={parts}')

# s=EP3293036A1; parts=[('EP3293036', 'A1')]
# s=EP3293036B; parts=[('EP3293036', 'B')]

1
结尾似乎过于明确了。为什么不用 r'(.*?)([AB].*)' 呢? - Kelly Bundy

1
您的示例数据表明,您实际上想要在数字和其后面的非数字之间进行拆分。基于这个假设:
front, back = re.split(r'(?<=\d)(?=\D)', number)

0

试试这个。

import re

def split_re(s):
    return [a for a in re.split(r'.{0}(?=[ABC])+',s) if a]  # Change `ABC` to `A-Za-z` if you want a partition if any alphabetic character is present likt('A','a','z','Y')
print(split_re('EP3293036A1'))  # -> ['EP3293036', 'A1']
print(split_re('US10661612B2')) # -> ['US10661612', 'B2']
print(split_re('CN107962948A')) # -> ['CN107962948','A']
print(split_re('ES15258411C1')) # -> ['ES15258411', 'C1']
print(split_re('CA107962948A')) # -> ['C', 'A107962948', 'A']

1
在开头的 . 显然表明您完全意识到,否则它将无法适用于例如 CN107962948,而当前的方式由于同样的原因也无法适用于例如 CA107962948 - Kelly Bundy
你从这个程序中得到什么输出。 - codester_09
@KellyBundy 我希望现在问题已经解决了。 - codester_09
1
之前它返回了['', 'A10796294', 'A'](甚至缺少了一个8)。现在它返回了['C', 'A107962948', 'A'] - Kelly Bundy
@KellyBundy 我编辑了我的答案,并附上了相应的输出。 - codester_09
展示一个错误来解决它是一种奇怪的方法 :-)。问题要求在右侧第一次出现的一个字符处将字符串拆分为两个部分。你的代码没有做到这些,就像示例所显示的那样。 - Kelly Bundy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接