ordering.py 971 B

12345678910111213141516171819202122232425262728293031
  1. import re
  2. def naturalize(value, max_length=None, integer_places=8):
  3. """
  4. Take an alphanumeric string and prepend all integers to `integer_places` places to ensure the strings
  5. are ordered naturally. For example:
  6. site9router21
  7. site10router4
  8. site10router19
  9. becomes:
  10. site00000009router00000021
  11. site00000010router00000004
  12. site00000010router00000019
  13. :param value: The value to be naturalized
  14. :param max_length: The maximum length of the returned string. Characters beyond this length will be stripped.
  15. :param integer_places: The number of places to which each integer will be expanded. (Default: 8)
  16. """
  17. output = []
  18. for segment in re.split(r'(\d+)', value):
  19. if segment.isdigit():
  20. output.append(segment.rjust(integer_places, '0'))
  21. elif segment:
  22. output.append(segment)
  23. ret = ''.join(output)
  24. return ret[:max_length] if max_length else ret