Regex в R смотреть за утверждением - PullRequest
2 голосов
/ 21 марта 2019

Я пытаюсь выполнить сопоставление с шаблоном с помощью функции extract из tidyr.Я проверил свое регулярное выражение на сайте практики регулярных выражений, шаблон работает, и я использую lookbehind assertion.

У меня есть следующий пример текста:

=[\"{ Key = source, Values = web,videoTag,assist }\",\"{ Key = type, 
Values = attack }\",\"{ Key = team, Values = 2 }\",\"{ Key = 
originalStartTimeMs, Values = 56496 }\",\"{ Key = linkId, Values = 
1551292895649 }\",\"{ Key = playerJersey, Values = 8 }\",\"{ Key = 
attackLocationStartX, Values = 3.9375 }\",\"{ Key = 
attackLocationStartY, Values = 0.739376770538243 }\",\"{ Key = 
attackLocationStartDeflected, Values = false }\",\"{ Key = 
attackLocationEndX, Values = 1.7897727272727275 }\",\"{ Key = 
attackLocationEndY, Values = -1.3002832861189795 }\",\"{ Key = 
attackLocationEndDeflected, Values = false }\",\"{ Key = lastModified, 
Values = web,videoTag,assist 

Я хочу получить числа, следующие за attackLocationX (все числа, следующие за любым текстом о месте атаки.

Использованиеследующий код с утверждением lookbehind, однако я не получаю результатов:

df %>% 
extract(message, "x_start",'((?<=attackLocationStartX,/sValues/s=/s)[0- 
9.]+)')

Эта функция вернет NA, если совпадение с образцом не найдено, и мой целевой столбец - все значения NA, несмотря на то, что я проверилшаблон на www.regexr.com. Согласно документации, R сопоставление с образцом поддерживает утверждения с задним числом, поэтому я не уверен, что еще здесь делать.

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Прежде всего, для соответствия пробелу необходимо \s, а не /s.

Здесь нет необходимости использовать просмотр сзади, поскольку extract вернет захваченные подстроки, если в шаблоне используются группы захвата.

Использовать

df %>% 
  extract(message, "x_start", "attackLocationStartX\\s*,\\s*Values\\s*=\\s*(-?\\d+\\.\\d+)")

Вывод: 3.9375.

Регулярное выражение также может выглядеть как "attackLocationStartX\\s*,\\s*Values\\s*=\\s*(-?\\d[.0-9]*)".

Поскольку часть (-?\\d+\\.\\d+) захвачена, выводится только текст в этой группе.

Детали шаблона

  • (-?\d+\.\d+) - группа захвата, для которой соответствует
    • -? - необязательный дефис (?означает 1 или 0 вхождений )
    • \d+ - 1 или или цифры (+ означает 1 или более )
    • \.- точка
    • \d+ - 1 или или цифры
  • \d[.0-9]* - цифра (\d), за которой следуют 0 или более точек или цифр ([.0-9]*)
0 голосов
/ 21 марта 2019

Я не уверен насчет задней части, но в R вам нужно избежать обратной косой черты.Это не очевидно, если вы используете проверку регулярных выражений, которая не является специфичной для R.

Дополнительная информация здесь .

Так что вы можете захотеть, чтобы ваше регулярное выражение выгляделочто-то вроде:

"attackLocationStartX,\\sValues\\s=\\s)[0-9.]+"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...