考虑以下字符串:
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](+
在一次和无限次之间匹配上一个令牌,如下所示尽可能多次,根据需要回馈(贪婪(