Предполагается, что адрес состоит только из букв и пробелов, а остальное разделено пробелами, а номер здания всегда начинается с числа , этого можно достичь следующим образом:
import re
s = ['Iso Omena 8 a 2', 'Xstreet 2', 'Isö Ømenå 8 a 2']
for addr in s:
street = re.findall('[^\d]*', addr)[0].strip()
rest = addr[len(street):].strip().split(' ')
print(street, rest)
# Iso Omena ['8', 'a', '2']
# Xstreet ['2']
# Isö Ømenå ['8', 'a', '2']
Или, если вы хотите, чтобы все было в одном кадре данных:
df = pd.DataFrame()
df['address'] = ['Iso Omena 8 a 2', 'Xstreet 2', 'Asdf 7 c', 'Isö Ømenå 8 a 2']
df['street'] = None; df['building'] = None; df['door'] = None; df['appartment'] = None
import re
for i, s in enumerate(df['address']):
street = re.findall('[^\d]*', s)[0].strip()
df.loc[i,('street')] = street
for col, val in zip(['building', 'door', 'appartment'], s[len(street):].strip().split(' ')):
df.loc[i,(col)] = val
# address street building door appartment
# 0 Iso Omena 8 a 2 Iso Omena 8 a 2
# 1 Xstreet 2 Xstreet 2 None None
# 2 Asdf 7 c Asdf 7 c None
# 3 Isö Ømenå 8 a 2 Isö Ømenå 8 a 2
РЕДАКТИРОВАТЬ: номер здания только слева от '-'sign:
вы можете просто заменить df.loc[i,(col)] = val
на
df.loc[i,(col)] = re.findall('[^-]*', val)[0]
если это подходит также для двери и квартиры. В противном случае вам придется выполнить if-test против col == 'building', чтобы использовать только эту версию.