使用R,我想从@type
标记内的JSON-LD有效载荷中捕获特定属性(在这种情况下为<script>
)。这是一个示例片段:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
...
这是R中用于执行属性提取的示例代码:
x <- "<script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"url\":\"https://www.foo.com/\""
regmatches(x, regexpr("<script [^>]*type *= *['\"] *application/ld.json *['\"][^>]*>[^}]+ ['\"] *@type *['\"] *: *['\"]([^'\"]+)['\"]", x, ignore.case = TRUE))
此代码的输出如下:
[1] "<script type=\"application/ld+json\">{ \"@context\": \"https://schema.org\" \"@type\":\"WebSite\""
我期望的输出是这个:
[1] "WebSite"
我对R并没有扎实的经验,对正则表达式也没有扎实的经验,但是令我感到困扰的是,我已经在regex101 website中尝试过此正则表达式(可以检查测试{{ 3}})。
您能提示我如何返回正确的属性而不是完整的测试字符串吗?
答案 0 :(得分:1)
您可以使用基于\K
的PCRE模式在特定模式之后提取'
和"
之外的任意1个以上的字符:
x <- "<script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"url\":\"https://www.foo.com/\""
p <- "<script\\s[^>]*type *= *['\"] *application/ld.json *['\"][^>]*>[^}]+['\"] *@type *['\"] *: *['\"]\\K[^'\"]+"
regmatches(x, regexpr(p, x, ignore.case = TRUE, perl=TRUE))
## => "WebSite"
它看起来像<SOME_LEFTHAND_CONTEXT_PATTERN>\K<WHAT_YOU_NEED>
。 \K
运算符将忽略到目前为止匹配的所有文本,并且您只会在结果中得到<WHAT_YOU_NEED>
。参见this pattern demo。不要忘记perl=TRUE
参数将在此处启用PCRE regex引擎。