数字を取り出す

とりあえずメモ程度に。あとで書く。

数字を抜くだけなら簡単だよね。

SEP = re.compile(r'[^\d]+')
def embedded_numbers1(s):
    return [int(x) for x in SEP.split(s) if x]

DIGITS = re.compile(r'\d+')
def embedded_numbers2(s):
    return [int(x) for x in DIGITS.findall(s)] 

なんか期待されてもあんまりおもしろいのは思い浮かばない。仕方がないので代入なしという縛りで。

import re

PAT = re.compile(r'([^\d]*)(\d+)([^\d]*)')
def embedded_numbers3(s):
    def f(lst, m):
        return lst[:-1] + [lst[-1] + m.group(1), int(m.group(2)), m.group(3)]

    return reduce(f, PAT.finditer(s), [''])

NONDIGITS = re.compile(r'^[^\d]*')
PAT2 = re.compile(r'(\d+)([^\d]*)')
def embedded_numbers4(s):
    return sum(
        ([int(m[0]), m[1]] for m in PAT2.findall(s)), 
        [NONDIGITS.match(s).group()])