Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从R中的一批URL中提取参数_R_Regex_Substr - Fatal编程技术网

从R中的一批URL中提取参数

从R中的一批URL中提取参数,r,regex,substr,R,Regex,Substr,我试图从R中的URL中提取一个参数。参数的确切位置将发生变化,因此我需要以其他方式识别它 下面是一个URL示例: https://www.example.se/-Hotell.d178317.Reseguide-Hotell-SMP?destinationId=178317&kword=ZzZz.4650002325454 我想提取d-在本例中178317之后的数字 目前我正在使用这个函数sub(“.d”,”,url),我不知道如何继续。有人能建议如何在这个例子中使用这个函数吗?干杯

我试图从R中的URL中提取一个参数。参数的确切位置将发生变化,因此我需要以其他方式识别它

下面是一个URL示例:

https://www.example.se/-Hotell.d178317.Reseguide-Hotell-SMP?destinationId=178317&kword=ZzZz.4650002325454
我想提取
d
-在本例中
178317
之后的数字


目前我正在使用这个函数
sub(“.d”,”,url)
,我不知道如何继续。有人能建议如何在这个例子中使用这个函数吗?干杯

我想您真正想要的是提取
destinationId
之后的任何内容,这样您就可以:

urls <- c("https://www.example.se/-Hotell.d178317.Reseguide-Hotell-SMP?destinationId=178317&kword=ZzZz.4650002325454")
gsub(".*?destinationId=(\\d+).*", "\\1", urls)

使用两个
sub
s:

> url
[1] "https://www.example.se/-Hotell.d178317.Reseguide-Hotell-SMP?destinationId=178317&kword=ZzZz.4650002325454"
这是第一个
“.d”
”之前的所有内容:

然后用一个
子文件
将从第一个非数字开始的所有内容切掉:

> sub("[^0-9].*","",sub(".*?\\.d","",url))
[1] "178317"

使用
as.numeric
生成一个数字。

使用比@Spacedman使用的更精细的正则表达式,结合他的两个部分加上匹配,您可以将其限制为一次sub()调用:

正则表达式的作用:

  • *匹配任意字符(.)零次或多次(*)
  • \\.d匹配一个点(实际字符,不是元字符;\\转义元字符),后跟一个d
  • ([0-9]+)至少包含一次从0到9([0-9])的数字(+);括号使此零件可用于匹配
  • \\。又是一个点
  • *后面跟任意字符

“\\1”匹配正则表达式中括号之间的位,该位现在被sub替换,因此作为输出。

该数字出现两次-在
Hotell.d
之后的URL路径中,并作为查询字符串中的真参数(
destinationId
)。例如,使用
httr::parse_url
获取参数很容易。@Spacedman,在本例中,destinationId重复出现,但并不总是出现两次。这就是为什么我想在“.d”之后提取它。你能建议一个不同的公式吗?所以它总是紧跟在第一个连续的点和“d”之后的一系列数字?不幸的是,destinationId参数并不总是存在于我的其他URL中(请原谅这个糟糕的例子)。因此,我需要使用一个更复杂的正则表达式从“.d”之后提取它,结合这两个加上匹配,您可以将它限制为一个sub()调用:
sub(“.\\\.d([0-9]+)\\\\..*,“\\1”,url)
@4rj4n,值得回答。我忘了在
sub
中匹配,R的正则表达式函数很烦人…完成了。我还删除了你在正则表达式中的问号。我不确定它是否添加到正则表达式中。是吗?谢谢你们,真的很感谢你们的帮助:)
> sub(".*?\\.d","",url)
[1] "178317.Reseguide-Hotell-SMP?destinationId=178317&kword=ZzZz.4650002325454"
> 
> sub("[^0-9].*","",sub(".*?\\.d","",url))
[1] "178317"
sub(".*\\.d([0-9]+)\\..*", "\\1", url)