import re from itertools import groupby name_key = lambda e: re.match('(\D+)',e).group(1) num_key = lambda e: int(re.match('.*?(\d+)',e).group(1)) stroka = "WTS1234, ACDW485, WTS72, SHR728, ACDW14, SHR16, WTS16" v_rezultate = ', '.join([', '.join(sorted(g,key=num_key)) for k,g in groupby(sorted(stroka.split(', '),key=name_key),key=name_key)]) v_rezultate Out[7]: 'ACDW14, ACDW485, SHR16, SHR728, WTS16, WTS72, WTS1234'
import re start = 'WB35, WB5, ME522, GA666, GA616, ME52' start = re.split(r', *', start) s = lambda i: re.search(r'[A-Za-z]+', i).group() d = lambda i: int(re.search(r'[0-9]+', i).group()) def _cmp(a, b): if s(a) == s(b): return cmp(d(a), d(b)) return 0 start.sort(_cmp) print ', '.join(start) >>> WB5, WB35, ME52, ME522, GA616, GA666 >>>
sergeek
в буквах не видно закономерности
#!/usr/bin/env python3 # "WTS1234, ACDW485, WTS72, SHR728, ACDW14, SHR16, WTS16" - исходная строка # "WTS16, WTS72, WTS1234, ACDW14, ACDW485, SHR16, SHR728" - отсортированная строка import re s = 'WTS1234, ACDW485, WTS72, SHR728, ACDW14, SHR16, WTS16' prefs = ('WTS', 'ACDW', 'SHR') out = [] for pref in prefs: lst = re.findall(pref + r'\d+', s) lst.sort(key=lambda i: int(re.search(r'\d+', i).group())) out.extend(lst) sout = ', '.join(out) print(s) print(sout)
[guest@localhost wnsort]$ ./t.py
WTS1234, ACDW485, WTS72, SHR728, ACDW14, SHR16, WTS16
WTS16, WTS72, WTS1234, ACDW14, ACDW485, SHR16, SHR728
[guest@localhost wnsort]$
py.user.nextно ведь не гоже благородному дону выполнять работу машины. Вдруг там таких хренек очень много?
prefs = ('WTS', ‘ACDW’, ‘SHR’)