Я пытаюсь выполнить сопоставление с образцом с помощью функции 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 поддерживает проверки назад, поэтому я не уверен, что еще здесь делать.
Попробуйте extract(message, "x_start", "attackLocationStartX\\s*,\\s*Values\\s*=\\s*(-?\\d+\\.\\d+)"). Он извлекает 3.9375. Это ожидается? Или нужен какой-то другой результат?
@WiktorStribiżew это работает отлично. Что делает -?? Я не видел этого раньше.





Я не уверен насчет ретроспективной части, но в R вам нужно избегать обратной косой черты. Это не очевидно, если вы используете средство проверки регулярных выражений, не относящееся к R.
Подробнее здесь.
Итак, вы можете захотеть, чтобы ваше регулярное выражение выглядело примерно так:
"attackLocationStartX,\\sValues\\s=\\s)[0-9.]+"
Прежде всего, для соответствия пробелам вам нужен \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]*)
Почему ты оглядываешься? Кажется, вы ищете «Ценности» после
attackLocationStartX.