Как разобрать угловые значения с помощью регулярных выражений - PullRequest
3 голосов
/ 01 июня 2009

У меня очень мало опыта использования регулярных выражений, и мне нужно проанализировать значение угла, выраженное в подшипниках, используя регулярные выражения, например:

"N45 ° 20'15.3" E "

Что представляет собой: 45 градусов, 20 минут с 15,3 секундами, расположенный в квадранте NE.

Ограничения:

  • Первый символ может быть «N» или «S»
  • Последний символ может быть «E» или «W»
  • 0 <= градусов <= 59 </li>
  • 0 <= минут <= 59 </li>
  • 0 <= секунда <60, это можно опустить. </li>

Python предпочтительно или любой другой язык.

Спасибо

Ответы [ 2 ]

8 голосов
/ 01 июня 2009

Попробуйте это регулярное выражение:

^([NS])([0-5]?\d)°([0-5]?\d)'(?:([0-5]?\d)(?:\.\d)?")?([EW])$

Соответствует любой строке, которая…

  • ^([NS]) начинается с N или S
  • ([0-5]?\d)°, за которым следует значение в градусах, либо одна цифра от 0 до 9 (\d), либо две цифры с первым числом от 0 до 5 [0-5]) и вторые 0 и 9, то есть между 0 и 59, за которыми следует °
  • ([0-5]?\d)' с последующим значением минут (снова между 0 и 59) и '
  • (?:([0-5]?\d)(?:\.\d)?")?, за которыми необязательно следуют значение секунд и знак ", значение секунд между 0 и 59 с необязательным дополнительным десятичным знаком и
  • ([EW])$ оканчивается либо E, либо W.

Если вы не хотите, чтобы значения ниже десяти имели предшествующие нули, измените [0-5] на [1-5].

4 голосов
/ 01 июня 2009

Шаблон, который вы можете использовать:

pat = r"^([NS])(\d+)°(\d+)'([\d.]*)\"?([EW])$"

один из способов его использования:

import re
r = re.compile(pat)
m = r.match(thestring)
if m is None:
  print "%r does not match!" % thestring
else:
  print "%r matches: %s" % (thestring, m.groups())

как вы заметите, после совпадения m.groups() дает вам различные части thestring, соответствующие каждой заключенной в скобки "группе" в pat - буква N или S, затем одна или несколько цифры для степеней и т. д. Я полагаю, что вы подразумеваете под "разбором" здесь.

...