Advertisement
goatbar

Xah's parsing challenge - answered in python

Apr 23rd, 2012
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.02 KB | None | 0 0
  1. # Wish I'd been up for writing an elisp version!  This is from 2011-11.  My blog is offline at the moment.  -kurt
  2.  
  3. # https://plus.google.com/u/0/113859563190964307534/posts/aqmFrjcY7WH
  4. #Here is my answers to emacs lisp exercise: latitude-longitude-decimalize. The first is dumb. It hard codes #the characters, which I think source-highlight mangled pretty badly. The code wasn't very pretty to start #with. The second solution is much more robust. It allows and character(s) to be the separator(s).
  5.  
  6.  
  7. #!/usr/bin/env python
  8. # -*- coding: utf-8 -*-
  9.  
  10. test_data = r"37ÃÇ°26âÂIJ36.42âÂijN 06ÃÇ°15âÂIJ14.28âÂijW"
  11.  
  12. def decimal_deg_simple(coord_str):
  13.     lat_str, lon_str = coord_str.split()
  14.     lat = int(lat_str.split('ÃÇ°')[0])
  15.     lat += int(lat_str.split('ÃÇ°')[1].split('âÂIJ')[0]) / 60.
  16.     lat += float(lat_str.split('âÂIJ')[1][:-4]) / 3600.
  17.     if 'S' in lat_str:
  18.         lat = -lat
  19.  
  20.     lon = int(lon_str.split('ÃÇ°')[0])
  21.     lon += int(lon_str.split('ÃÇ°')[1].split('âÂIJ')[0]) / 60.
  22.     lon += float(lon_str.split('âÂIJ')[1][:-4]) / 3600.
  23.     if 'W' in lon_str:
  24.         lon = -lon
  25.  
  26.     return lat,lon
  27.  
  28. print 'simple:', decimal_deg_simple(test_data)
  29.  
  30. ########################################
  31. # Use a regular expression
  32.  
  33. import re
  34.  
  35. rawstr = r"""(?P<lat_deg>\d{1,2})\D+
  36. (?P<lat_min>\d{1,2})\D+
  37. (?P<lat_sec>\d{1,2}(\.\d+))\D+
  38. (?P<lat_hemi>[NS])
  39. \s+
  40. (?P<lon_deg>\d{1,3})\D+
  41. (?P<lon_min>\d{1,2})\D+
  42. (?P<lon_sec>\d{1,2}(\.\d+))\D+
  43. (?P<lon_hemi>[EW])
  44. """
  45.  
  46. compile_obj = re.compile(rawstr,  re.VERBOSE)
  47.  
  48. def decimal_deg_re(coord_str):
  49.     g = compile_obj.search(coord_str).groupdict() # m is match
  50.     lat = int(g['lat_deg']) + int(g['lat_min'])/60. + float(g['lat_sec']) / 3600.
  51.     if g['lat_hemi'] == 'S':
  52.         lat = -lat
  53.     lon = int(g['lon_deg']) + int(g['lon_min'])/60. + float(g['lon_sec']) / 3600.
  54.     if g['lon_hemi'] == 'S':
  55.         lon = -lon
  56.     return {'y':lat, 'x':lon}
  57.  
  58. print 're:', decimal_deg_re(test_data)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement