Вы можете использовать re.findall
с шаблоном, который ищет либо алфавиты, либо чисто цифры, и использует шаблоны негативного взгляда назад и негативного прогнозирования, чтобы избежать их смешивания:
import re
re.findall(r'(?<![a-z\d])(?:[a-z]+|\d+)(?![a-z\d])', s, re.IGNORECASE) for s in l]
, так что дано:
l = [
'Paraguay-2018_500x500',
'Paraguay-2018_120X120',
'Paraguay-2018_64xx64',
'Matt-21_Birthday_2019',
'Matt-21_Birthday-1024x800_2019',
'Matt-21_Birthday-800x800_2019',
'Matt-21_Birthday-500x500_2019'
]
это возвращает:
[['Paraguay', '2018'],
['Paraguay', '2018'],
['Paraguay', '2018'],
['Matt', '21', 'Birthday', '2019'],
['Matt', '21', 'Birthday', '2019'],
['Matt', '21', 'Birthday', '2019'],
['Matt', '21', 'Birthday', '2019']]
Если вы не хотите использовать регулярное выражение, вы можете вместо этого использовать itertools.groupby
с ключевой функцией str.isalnum
для получения буквенно-цифровых символовтокены из заданной строки, а затем используйте другой фильтр, который объединяет str.isalpha
и str.isdigit
, чтобы исключить токены, представляющие собой смесь алфавитов и цифр:
from itertools import groupby
[[t for t in (''.join(g) for k, g in groupby(s, key=str.isalnum) if k) if t.isalpha() or t.isdigit()] for s in l]