Регулярное выражение в утверждении R lookbehind

Я пытаюсь выполнить сопоставление с образцом с помощью функции 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 поддерживает проверки назад, поэтому я не уверен, что еще здесь делать.

Почему ты оглядываешься? Кажется, вы ищете «Ценности» после attackLocationStartX.

akash87 21.03.2019 15:00

Попробуйте extract(message, "x_start", "attackLocationStartX\\s*,\\s*Values\\s*=\\s*(-?\\d+\\.\\d+)‌​"). Он извлекает 3.9375. Это ожидается? Или нужен какой-то другой результат?

Wiktor Stribiżew 21.03.2019 15:08

@WiktorStribiżew это работает отлично. Что делает -?? Я не видел этого раньше.

Todd Shannon 21.03.2019 19:01
-? — необязательный дефис. Кстати, я разместил ответ ниже.
Wiktor Stribiżew 21.03.2019 19:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
101
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не уверен насчет ретроспективной части, но в 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]*)

Другие вопросы по теме