You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

59 lines
1.5 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. import edlib
  2. import re
  3. import json
  4. def editdistance(a, b):
  5. return edlib.align(a, b)['editDistance']
  6. class Search:
  7. def __init__(self, query):
  8. self.raw_lower = query.lower()
  9. def __call__(self, arg):
  10. arg = arg.lower()
  11. return editdistance(self.raw_lower, arg)
  12. def __str__(self):
  13. print(self.raw_lower)
  14. def __repr__(self):
  15. return str(self)
  16. class StopSearch(Search):
  17. def __init__(self, query):
  18. super().__init__(query)
  19. query = query.lower()
  20. parts = re.split(r' ?(?:(?<!\w)and(?!\w)|&) ?', query)
  21. self.query = ' & '.join(parts)
  22. self.query_reversed = ' & '.join(reversed(parts))
  23. def __call__(self, stop):
  24. stop = stop.lower()
  25. paren = re.search(r'\((?P<data>[^\)]+)\)', stop)
  26. ret = [
  27. editdistance(self.query, stop),
  28. editdistance(self.query_reversed, stop),
  29. ]
  30. if paren:
  31. paren = paren.group('data')
  32. ret.append(editdistance(self.query, paren))
  33. if self.raw_lower in stop:
  34. ret = (item - 100 for item in ret)
  35. return min(
  36. ret
  37. )
  38. def __str__(self):
  39. return '{}|{}'.format(self.query, self.query_reversed)
  40. if __name__ == "__main__":
  41. with open('stops_out.json') as file:
  42. data = json.load(file)
  43. names = [stop['stpnm'] for stop in data['stops']]
  44. while True:
  45. q = StopSearch(input('Search: '))
  46. print('\n'.join(sorted(names, key=q)), end='\n'*3)