Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
Regular expression magic solution in Clear category for Sort by Extension by sudee
from typing import List
import re
def by_ext(filename):
""" returns a tuple of the extension and the name for sorting """
p = re.compile('''
(?P # name capture group, has 3 alternative non-capturing groups
(?:[^.]+?(?:\.[^.]+)*?) # starting with any non-dot chars, then any number of extension-like fragments
|(?:\.[^.]+) # starting with a dot, then any non-dot chars
|(?:[^.]+\.)*) # starting with any non-dot chars, ending with a dot
(?P # extension capture group, needed for returning a pair, even if there is no extension
(?:\.[^.]+)?) # optional non-capturing group for the extension
''', re.VERBOSE)
m = p.fullmatch(filename).groupdict()
return m['extension'], m['name']
def sort_by_ext(files: List[str]) -> List[str]:
return sorted(files, key=by_ext)
if __name__ == '__main__':
print("Example:")
print(sort_by_ext(['1.cad', '1.bat', '1.aa']))
# These "asserts" are used for self-checking and not for an auto-testing
assert sort_by_ext(['1.cad', '1.bat', '1.aa']) == ['1.aa', '1.bat', '1.cad']
assert sort_by_ext(['1.cad', '1.bat', '1.aa', '2.bat']) == ['1.aa', '1.bat', '2.bat', '1.cad']
assert sort_by_ext(['1.cad', '1.bat', '1.aa', '.bat']) == ['.bat', '1.aa', '1.bat', '1.cad']
assert sort_by_ext(['1.cad', '1.bat', '.aa', '.bat']) == ['.aa', '.bat', '1.bat', '1.cad']
assert sort_by_ext(['1.cad', '1.', '1.aa']) == ['1.', '1.aa', '1.cad']
assert sort_by_ext(['1.cad', '1.bat', '1.aa', '1.aa.doc']) == ['1.aa', '1.bat', '1.cad', '1.aa.doc']
assert sort_by_ext(['1.cad', '1.bat', '1.aa', '.aa.doc']) == ['1.aa', '1.bat', '1.cad', '.aa.doc']
print("Coding complete? Click 'Check' to earn cool rewards!")
April 13, 2021