R语言中的正则表达式:后顾断言

3
我想使用tidyr中的extract函数进行一些模式匹配。在正则表达式练习网站上测试了我的正则表达式,该模式似乎有效,并且我正在使用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后面的数字(也就是攻击位置相关文本后面的所有数字)。

使用以下具有回顾断言的代码,然而,我没有得到任何结果:

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

如果未找到模式匹配,此函数将返回NA,尽管在www.regexr.com上测试了该模式,但我的目标列仍然是所有NA值。根据文档,R模式匹配支持向后断言,因此在这里我不确定还能做什么。


你为什么要往后看?看起来你是在寻找 attackLocationStartX 后面的“Values”。 - akash87
尝试使用 extract(message, "x_start", "attackLocationStartX\\s*,\\s*Values\\s*=\\s*(-?\\d+\\.\\d+)")。它会提取出 3.9375。这是预期的结果吗?还是你需要其他的输出? - Wiktor Stribiżew
@WiktorStribiżew 这个完美地运行了。-? 是什么意思?我以前没见过。 - Todd Shannon
“-?”是可选连字符。顺便说一下,我在下面发布了一个答案。 - Wiktor Stribiżew
2个回答

0
首先,要匹配空格,您需要使用\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

我不确定关于回顾部分,但在R中,您需要转义反斜杠。如果您使用的是非特定于R的正则表达式检查器,则这并不明显。

更多信息在这里

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接