У меня есть массив со следующими значениями: ['1.hello', '10.hel', '12B.hepl', '9.hell', '12A.help', '2.helo']
Я хочу, чтобы они отсортировались как: ['1.hello', '2.helo', '9.hell', '10.hel', '12A.help', '12B.hepl']
Любое решение регулярного выражения также было бы предпочтительным. Все, что после ., не должно учитываться при сортировке массива.






Просто найдите первую числовую последовательность и приведите ее к int:
import re
def get_sorting(s):
s = re.findall(r'^\d+[A-Z]\.', s)[0].rstrip('.')
num = int(s[:-1])
return num, s[-1]
arr = sorted(arr, key = get_sorting)
обновлять
Как было предложено @Raj006 в комментариях, если вы хотите, чтобы он поддерживал много букв после номера, вместо этого используйте функцию ниже:
def get_sorting(s):
a = re.match('(\d+)([A-Z]*)\.', s)
number = int(a.group(1))
text = a.group(2)
return number,text
Измените регулярное выражение, чтобы оно начиналось с начала строки r'^\d+[A-Z]\.', чтобы быть более явным. В остальном решение выглядит хорошо.
x не определен в строке 3
предоставление индекса списка ошибок вне допустимого диапазона при замене x на s
a = re.match('(\d+)([A-Z]*)\.', s)number = int(a.group(1))text = a.group(2)return number, text Это даст вам полное решение, и, конечно же, библиотека natsort также сделает это.
Позвольте мне проверить это, вы уверены, что тестируете функцию для данного ввода?
Если вы устанавливаете библиотеку
natsort, это вызов одной функции.