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.

46 lines
1.5 KiB

7 years ago
7 years ago
7 years ago
  1. import edlib
  2. def editdistance(a,b):
  3. return edlib.align(a,b)['editDistance']
  4. import re
  5. import json
  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)