2017-02-02 2 views
0

Предположим следующее мои данные,Запись Regex в улье

string 

&geoLati=33.75875& 
&loclat=39.5586& 
&ang_lat_add_one_more=35.4789& 
&slat=45.2563& 
&LAT=12.5698& 
&vloclat=65.4789& 
&latpoi=35.2478& 
&lat_lkj=25.6523& 
&someother_lat=25.6523& 
&lat=65.3214&lat=98.4562& 

У меня есть длинная строка (URL), и я хочу, чтобы проверить на широчайшие ключевое слово присутствует в строке, а затем проверить ближайший " = "и разобрать значение до следующего" & ". В идеале я хочу написать выражение, которое будет отделять значения от вышеуказанного набора данных.

Следующая моя попытка,

select regexp_extract(string, 'lat=(.*?)(&)') as output 

Это, кажется, хорошо работать с большинством из них, но не работает с немногими, а также. Ниже приведен вывод,

output 
     "" 
     39.5586 
     "" 
     45.2563 
     "" 
     65.4789 
     "" 
     "" 
     25.6523 
     65.3214 

Может ли кто-нибудь помочь мне в модификации выражения, чтобы получить все значения? Я хочу проверить ключевое слово lat независимо от случая и искать ближайший знак «=», а затем анализировать значения до следующего «&».

Мой ожидается выход,

output 
33.75875 
39.5586 
35.4789 
45.2563 
12.5698 
65.4789 
35.2478 
25.6523 
25.6523 
65.3214 

Любая помощь будет оценена.

Thanks

+0

TRY 'ш = ([^ &] +)' или даже '[^&] + '. –

+0

@ WiktorStribiżew Спасибо за ответ. это не работает с «geoLati» – Observer

+0

Вы не уточнили ожидаемый результат. Затем попробуйте '(? I) lat \ w * = ([^ &] +)' –

ответ

1

Вы можете использовать

(?i)lat\w*=([^&]+) 

См regex demo.

Детали:

  • (?i) - регистронезависимы режим
  • lat - буквальное последовательность голец
  • \w* - 0+ слово символы
  • = - это символ =
  • ([^&]+) - Группа 1: один или несколько символов, кроме &.

В улья, использовать двойные символы обратной косой черты (? I) (? Я) (? <= Ш =)

select regexp_extract("&lati=35.2478&" , '(?i)lat\\w*=([^&]+)') as output 
+0

Stribizew Можем ли мы заставить это выражение возвращать только числа? Если есть какой-либо текст, мы можем его игнорировать? Можем ли мы добавить это условие к этому выражению? Извините, что беспокою вас больше. Я изучаю регулярное выражение и пытаюсь его удержать. – Observer

+0

Регулярное выражение, которое вы хотите, должно иметь своего рода положительный lookbehind. Попробуйте '' (? I) (? <= Lat \\ w {0,50} =) [^ &] + '', который будет работать на Java, а Hive, похоже, использует Java regex. В Python с 're', это невозможно вообще, но Python содержит' re.findall' и другие методы, которые позволяют легко получить доступ к захваченным группам. –

0

Это должно работать.

(\b\d.+) 

Вход:

&geoLati=33.75875& 
&loclat=39.5586& 
&ang_lat_add_one_more=35.4789& 
&slat=45.2563& 
&LAT=12.5698& 
&vloclat=65.4789& 
&latpoi=35.2478& 
&lat_lkj=25.6523& 
&someother_lat=25.6523& 
&lat=65.3214&lat=98.4562& 

Выход:

75875& 
5586& 
4789& 
2563& 
5698& 
4789& 
2478& 
6523& 
6523& 
4562& 

Python код:

# coding=utf8 
# the above tag defines encoding for this document and is for Python 2.x compatibility 

import re 

regex = r"(\b\d.+)" 

test_str = ("&geoLati=33.75875&\n" 
    "&loclat=39.5586&\n" 
    "&ang_lat_add_one_more=35.4789&\n" 
    "&slat=45.2563&\n" 
    "&LAT=12.5698&\n" 
    "&vloclat=65.4789&\n" 
    "&latpoi=35.2478&\n" 
    "&lat_lkj=25.6523&\n" 
    "&someother_lat=25.6523&\n" 
    "&lat=65.3214&lat=98.4562&") 

matches = re.finditer(regex, test_str, re.MULTILINE) 

for matchNum, match in enumerate(matches): 
    matchNum = matchNum + 1 

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group())) 

    for groupNum in range(0, len(match.groups())): 
     groupNum = groupNum + 1 

     print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum))) 

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution. 

См: https://regex101.com/r/causfX/2

+0

это не работает. выберите regexp_extract ("& lat = 35.2478 &", '(\ b \ d. +)'), так как вывод не дает выход – Observer

+1

, я думаю, вы должны использовать (\\ b \\ d. +) –