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.

32 lines
1.1 KiB

  1. from editdistance import eval as editdistance
  2. import re
  3. import json
  4. class StopSearch:
  5. def __init__(self,query):
  6. query = query.lower()
  7. parts = re.split(r' ?(?:(?<!\w)and(?!\w)|&) ?',query)
  8. self.query = ' & '.join(parts)
  9. self.query_reversed = ' & '.join(reversed(parts))
  10. def __call__(self,stop):
  11. stop = stop.lower()
  12. paren = re.search(r'\((?P<data>[^\)]+)\)',stop)
  13. ret= [
  14. editdistance(self.query,stop),
  15. editdistance(self.query_reversed,stop),
  16. ]
  17. if paren:
  18. paren = paren.group('data')
  19. ret.append(editdistance(self.query,paren))
  20. return min(
  21. ret
  22. )
  23. def __str__(self):
  24. return '{}|{}'.format(self.query,self.query_reversed)
  25. def __repr__(self):
  26. return str(self)
  27. if __name__ == "__main__":
  28. with open('stops_out.json') as file:
  29. data = json.load(file)
  30. names = [stop['stpnm'] for stop in data['stops']]
  31. while True:
  32. q = StopSearch(input('Search: '))
  33. print('\n'.join(sorted(names,key=q)))