R中的regexpr语法

时间:2019-01-07 08:25:31

标签: r regex

我正在尝试以下方法,应该可以使我获得productUrl://和以下?之间的一切

(?<=\"productUrl\"\:\"\/\/)(.*?)(?=\?)

以上内容适用于https://regexr.com/

然后,我尝试转义反斜杠以使该字符串适合grep函数,但是没有运气。正确的做法是什么?

请参见以下示例:link to example

我实际上需要提取与我的模式匹配的子字符串,因此grep可以与其他函数结合使用。

1 个答案:

答案 0 :(得分:11)

请注意,您不需要在R regex模式中转义/,因为它们是用字符串文字定义的,并且/不是特殊的regex元字符。如果您想在"字符串文字内写一个"...",则应该像已经做的那样用单个\对其进行转义。

如果使用单引号定义字符串文字并且将.*?(?=\?)变成否定的字符类,则可以避免此处的转义:

grep('(?<="productUrl":"//)([^?]*)', x, perl=TRUE)

[^?]*否定的字符类与?以外的0个或更多字符匹配。

如果您要检查的字符串没有双引号,请将其从后面的字符串中删除:

grep('(?<=productUrl://)([^?]*)', x, perl=TRUE)

您也可以使用\K来代替匹配的部分:

grep('productUrl://\\K[^?]*', x, perl=TRUE)
                   ^^^ 

实际上,您甚至不需要模式中的捕获组。

解决实际任务

您不能提取R中带有grep的子字符串,只能使用grep查找/识别要从字符向量中提取的元素。要提取子字符串,您需要使用基数R regmatches或字符串str_extract / str_extract_all或类似的match函数。

以R为底的示例:

> x <- '":"ppath","value":[],"hidden":false,"locked":false}],"bizData":"","pos":0},"listItems":[{"name":"BRAND\'S® Lutein Essence 6 Bottles x 60ml","nid":"66765568","icons":[{"domClass":"lazMall","text":"LazMall","alias":"LazMallAlias","type":"img","group":"1","showType":"0","order":0}],\n"productUrl":"//www.lazada.sg/products/brands-lutein-essence-6-bottles-x-60ml-i138897006-s167303363.html?search=1","image":"https://sg-test-11.slatic.net/p/5337f879236ece2f14158c055adcdef7.jpg",\n"productUrl":"//www.lazada.sg/products/brands-lutein-essence-6-bottles-x-60ml-i138897006-s167303363.html?search=1","sku":"BR924HBAB3R0N4SGAMZ","skuId":"167303363"}],"restrictedAge":0,"categories":[1438,1565,4776,7305'
> regmatches(x, gregexpr('"productUrl":"\\K[^?"]*', x, perl=TRUE))
[[1]]
[1] "//www.lazada.sg/products/brands-lutein-essence-6-bottles-x-60ml-i138897006-s167303363.html"
[2] "//www.lazada.sg/products/brands-lutein-essence-6-bottles-x-60ml-i138897006-s167303363.html"

使用 stringr

> library(stringr)
> str_extract_all(x, '(?<="productUrl":")[^?"]*')
[[1]]
[1] "//www.lazada.sg/products/brands-lutein-essence-6-bottles-x-60ml-i138897006-s167303363.html"
[2] "//www.lazada.sg/products/brands-lutein-essence-6-bottles-x-60ml-i138897006-s167303363.html"