Вы можете решить эту проблему, применив itertools.takewhile :
В пандах:
data = """111042345--
111042345
110374217dclid=CA-R3K
109202817lciz@MM10082IA""".split()
import pandas as pd
from itertools import takewhile
df = pd.DataFrame(data)
df["numbers"] = df[0].apply(lambda x:''.join(takewhile(str.isdigit,x)) )
print(df)
Вывод (панд):
0 numbers
0 111042345-- 111042345
1 111042345 111042345
2 110374217dclid=CA-R3K 110374217
3 109202817lciz@MM10082IA 109202817
Для обычных списков:
data = """111042345--
111042345
110374217dclid=CA-R3K
109202817lciz@MM10082IA""".split()
print(data)
from itertools import takewhile
d = [ ''.join(takewhile(str.isdigit,text)) for text in data]
print(d)
Вывод (простые списки):
# splitted data
['111042345--', '111042345', '110374217dclid=CA-R3K', '109202817lciz@MM10082IA']
# itertools.takewhile
['111042345', '111042345', '110374217', '109202817']
Пограничный регистр:
Предложено Скоттом Бостоном , потому что более эффективно:
df["faster numbers"] = [''.join(takewhile(str.isdigit,i)) for i in df[0]]´
(Аналогичный вывод - заголовок другого столбца)