从字符串中提取最后一个数字序列及其前面的所有数字



考虑以下字符串:

AB01CD03

我想做的是将其分解为两个令牌,即AB01CD和03。

在我的字符串中,最后一个字母后面的位数是未知的。字符串的末尾总是有一个数字序列。

现在,我可以做到:

import re
S = 'AB01CD03'
v, = re.findall(r'(d+)$', S)
assert v == '03'

因为我现在知道v的长度,我可以推断出如何使用切片来获取前导码,例如

preamble = S[:-len(v)]
assert preamble == 'AB01CD'

考虑到前导码可能包含数字,我想要的是一个单独的RE,它将显示两个单独的令牌,即

a, b = re.findall(MAGIC_EXPRESSION, S)

这可能吗?

是的,像这样:

import re
s = 'AB01CD03'
m = re.match(r'^(.+?)(d+)$', s)
print(m.group(1), m.group(2))

这是因为组(.+?)不是贪婪的,所以允许第二组(d+)匹配末尾的所有数字。CCD_ 3和CCD_。

结果:

AB01CD 03

更接近您要求的语法:

a, b = re.match(r'^(.+?)(d+)$', s).groups()

您可以使用这个:

import re
ls = ['AB01CD03', 'AB34565701CD04564563']
for s in ls:
a, b = re.findall(r'(.*(?:D|^))(d+)', s)[0]
print(a,b)

输出:

AB01CD 03
AB34565701CD 04564563

(.*(?:D|^))(d+)

第一捕获组(.*(?:\D|^((

  • .匹配任何字符(行终止符除外(

  • *在零次和无限次之间匹配上一个令牌,

尽可能多次,根据需要回馈(贪婪(

非捕获组(?:D|^)

第一个备选D

  • D匹配任何非数字字符(相当于[^0-9](

第二个备选^

  • ^在一行开始时断言位置

第二捕获组(d+)

  • d匹配一个数字(相当于[0-9](

    +在一次和无限次之间匹配上一个令牌,如下所示尽可能多次,根据需要回馈(贪婪(

最新更新