Advertisement
gruntfutuk

coords extract

Sep 26th, 2019
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.53 KB | None | 0 0
  1. 'convert string of bracketed coordinate pairs to list of coordinate tuple integer pairs'
  2. 'format (x1, y1) (x2, y2) ... (xn, yn)'
  3.  
  4. def next_coords(slice):
  5.     'extract next coordinate pair and return that and remaining text'
  6.     slice = slice.strip()  # just in case
  7.     if not slice.startswith('('):
  8.         raise ValueError("Expecting '(' token next")
  9.     pos_close = slice.find(')')  # find position of next )
  10.     if pos_close == -1:  # a -1 indicates a ) was not found
  11.         raise ValueError("Expecting ')' token next")
  12.     x, _ , y = slice[1:pos_close].partition(',')
  13.     if not x or not y:
  14.         raise ValueError("Expecting coordinates between '()'")
  15.     try:
  16.         coords = int(x), int(y)
  17.     except ValueError:
  18.         raise ValueError("Non-integer(s) found between '()'")
  19.     return coords, slice[pos_close+1:]
  20.  
  21.  
  22. def parse_buffer(buffer):
  23.     'build & return list of coord integer pair tuples'
  24.     stack = []
  25.     err_message = ''
  26.     while buffer:
  27.         try:
  28.             coords, buffer = next_coords(buffer)
  29.         except ValueError as e:
  30.             err_message = e
  31.             break
  32.         else:
  33.             stack.append(coords)
  34.     return stack, err_message, buffer
  35.  
  36.  
  37. tests = ['  (123, 456)    (67,12) (54,67)   ',
  38.          '()', '(test)', '(test, test)',
  39.          '(23,4),(45,67)', '(23,34)(34.5, 67)']
  40. for test in tests:
  41.     stack, err_message, buffer = parse_buffer(test)
  42.     print(f'\ntest: {test}\nstack: {stack}')
  43.     if err_message:
  44.         print(f'Remaining buffer: {buffer}\n{err_message}')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement