R lookback断言中的正则表达式

R lookback断言中的正则表达式,r,regex,lookbehind,R,Regex,Lookbehind,我正在尝试使用tidyr中的extract函数进行一些模式匹配。我已经在一个regex实践站点上测试了我的regex,该模式似乎有效,我正在使用lookback断言 我有以下示例文本: =[\"{ Key = source, Values = web,videoTag,assist }\",\"{ Key = type, Values = attack }\",\"{ Key = team, Values = 2 }\",\"{ Key = originalStartTimeMs, Valu

我正在尝试使用
tidyr
中的
extract
函数进行一些模式匹配。我已经在一个regex实践站点上测试了我的regex,该模式似乎有效,我正在使用
lookback断言

我有以下示例文本:

=[\"{ 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
后面的数字(关于攻击位置的任何文本后面的所有数字)

但是,使用以下带有Lookback断言的代码,我没有得到任何结果:

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

提取(消息,“x_start”,”(?我不确定lookbehind部分,但在R中,您需要转义反斜杠。如果您使用的是非R特定的正则表达式检查器,这一点并不明显

更多信息

因此,您可能希望您的正则表达式看起来像:

"attackLocationStartX,\\sValues\\s=\\s)[0-9.]+"

首先,要匹配空白,您需要
\s
,而不是
/s

您不必在这里使用lookbehind,因为如果模式中使用了捕获组,
extract
将返回捕获的子字符串

使用

输出:
3.9375

正则表达式也可能类似于
“attackLocationStartX\\s*,\\s*Values\\s*=\\s*(?\\d[.0-9]*)”

当捕获
(?\\d+\\.\\d+
部分时,仅此组中的文本将作为输出

图案细节

  • (?\d+\.\d+)
    -捕获组thst匹配
    • -?
      -可选连字符(
      表示出现1次或0次)
    • \d+
      -1或多个数字(
      +
      表示1或多个)
    • \。
      -一个点
    • \d+
      -1或数字
  • \d[.0-9]*
    -一个数字(
    \d
    ),后跟0个或多个点或数字(
    [.0-9]*

为什么要向后看?似乎您正在查找
攻击位置开始发送后的“值”
。请尝试
提取(消息,“x\u开始”,“攻击位置开始发送\\s*,\\s*值\\s*=\\s*(?\\d+\\\\\\d+))
。它提取了
3.9375
。这是预期的结果吗?或者你需要其他结果吗?@WiktorStribiżew这非常有效。
-?
做什么?我以前没见过。
-?
是可选的连字符。顺便说一句,我贴了一个。
df %>% 
  extract(message, "x_start", "attackLocationStartX\\s*,\\s*Values\\s*=\\s*(-?\\d+\\.\\d+)")