Предварительно скомпилируйте шаблон регулярного выражения с предвидением (объяснено ниже) и используйте regex.match
в понимании списка:
>>> import re
>>> p = re.compile(r'\D+?(?=\s*([A-Z]{2})?\s*\d)')
>>> [p.match(x).group() for x in data]
[
'Tortillas Bolsa',
'Tortillinas',
'Bollos',
'Super Pan Bco Ajonjoli',
'Pan Blanco Bimbo Rendidor',
'Gansito'
]
Здесь data
- ваш список строк.
Подробности
\D+? # anything that isn't a digit (non-greedy)
(?= # regex-lookahead
\s* # zero or more wsp chars
([A-Z]{2})? # two optional uppercase letters
\s*
\d # digit
)
В случае, если какая-либо строка не содержит искомый шаблон, понимание списка будет ошибочным (с AttributeError), поскольку re.match
возвращает None
в этом случае. Затем вы можете использовать цикл и проверить значение re.match
перед извлечением соответствующей части.
matches = []
for x in data:
m = p.match(x)
if m:
matches.append(m.group())
Или, если вы хотите заполнитель None
, когда нет совпадений:
matches = []
for x in data:
matches.append(m.group() if m else None)