使用R正则表达式拆分域和路径

使用R正则表达式拆分域和路径,r,R,我有一个包含URL的数据集,我想使用正则表达式拆分它。我已经创建了一个我相信有效的正则表达式,但是我不确定如何在R中实现它 这是我的正则表达式: - Domain: ^(.*[\\\/]) - Path: (\/[0-9].*\?|$) #库 库(tidyr)#函数分离、提取 # 1. 读取数据 df=read.csv2(text=“datetime | url 2021-05-29 16:57:09|https://stackoverflow.com/questions/67755241

我有一个包含URL的数据集,我想使用正则表达式拆分它。我已经创建了一个我相信有效的正则表达式,但是我不确定如何在R中实现它

这是我的正则表达式:

- Domain: ^(.*[\\\/])
- Path:   (\/[0-9].*\?|$)
#库
库(tidyr)#函数分离、提取
# 1. 读取数据
df=read.csv2(text=“datetime | url
2021-05-29 16:57:09|https://stackoverflow.com/questions/67755241/how-do-i-put-row-data-from-a-database-into-a-php-variable
2021-05-29 16:58:09|https://stackoverflow.com/
2021-05-29 16:59:09|https://stackoverflow.com/hacker
2021-05-29 17:00:09|https://stackoverflow.com/jobs?so_medium=StackOverflow&so_source=SiteNav
2021-05-29 17:01:09|http://www.bbc.co.uk/
2021-05-29 17:02:09|http://www.bbc.com/weather/2643743?day=3",
sep=“|”,stringsAsFactors=F,na.strings=“未知”);
# 2. 将URL拆分为域和路径
#域:^(.[\\/]))
#路径:(\/[0-9].\?|$)
df%提取(url,c(“域”,“路径”),“^(.[\\\\/])(\\/[0-9].\\\?\$)”)
df
这将产生以下结果:

##              datetime                     Domain Path
## 1 2021-05-29 16:57:09                       <NA> <NA>
## 2 2021-05-29 16:58:09 https://stackoverflow.com/     
## 3 2021-05-29 16:59:09                       <NA> <NA>
## 4 2021-05-29 17:00:09                       <NA> <NA>
## 5 2021-05-29 17:01:09     http://www.bbc.co.uk/     
## 6 2021-05-29 17:02:09                       <NA> <NA>
##日期时域路径
## 1 2021-05-29 16:57:09                        
## 2 2021-05-29 16:58:09 https://stackoverflow.com/     
## 3 2021-05-29 16:59:09                        
## 4 2021-05-29 17:00:09                        
## 5 2021-05-29 17:01:09     http://www.bbc.co.uk/     
## 6 2021-05-29 17:02:09                        

您可以使用以下正则表达式-

tidyr::extract(df, url, c('Domain', 'path'), '(https?://.*?/)(.*)')

#             datetime                     Domain
#1 2021-05-29 16:57:09 https://stackoverflow.com/
#2 2021-05-29 16:58:09 https://stackoverflow.com/
#3 2021-05-29 16:59:09 https://stackoverflow.com/
#4 2021-05-29 17:00:09 https://stackoverflow.com/
#5 2021-05-29 17:01:09      http://www.bbc.co.uk/
#6 2021-05-29 17:02:09        http://www.bbc.com/
                                                                          path
#1 questions/67755241/how-do-i-put-row-data-from-a-database-into-a-php-variable
#2                                                                             
#3                                                                       hacker
#4                               jobs?so_medium=StackOverflow&so_source=SiteNav
#5                                                                             
#6                                                        weather/2643743?day=3
相同的正则表达式可用于基本R
strcapture
-

strcapture('(https?://.*?/)(.*)', df$url, 
           proto = list(Domain = character(), path = character()))

您可以使用以下正则表达式-

tidyr::extract(df, url, c('Domain', 'path'), '(https?://.*?/)(.*)')

#             datetime                     Domain
#1 2021-05-29 16:57:09 https://stackoverflow.com/
#2 2021-05-29 16:58:09 https://stackoverflow.com/
#3 2021-05-29 16:59:09 https://stackoverflow.com/
#4 2021-05-29 17:00:09 https://stackoverflow.com/
#5 2021-05-29 17:01:09      http://www.bbc.co.uk/
#6 2021-05-29 17:02:09        http://www.bbc.com/
                                                                          path
#1 questions/67755241/how-do-i-put-row-data-from-a-database-into-a-php-variable
#2                                                                             
#3                                                                       hacker
#4                               jobs?so_medium=StackOverflow&so_source=SiteNav
#5                                                                             
#6                                                        weather/2643743?day=3
相同的正则表达式可用于基本R
strcapture
-

strcapture('(https?://.*?/)(.*)', df$url, 
           proto = list(Domain = character(), path = character()))
  • 第一个捕获组
    ^([^//]*/[^/]*/{1})
    捕获从开始到两个//然后//以及直到/然后/仅一个的所有内容
  • 第二个捕获组捕获到结束前剩余的所有内容
  • 第一个捕获组
    ^([^//]*/[^/]*/{1})
    捕获从开始到两个//然后//以及直到/然后/仅一个的所有内容
  • 第二个捕获组捕获到结束前剩余的所有内容

谢谢,成功了!如果站点使用http://而不是https://怎么办?可以修改为同时使用http://和https://吗?可以,请参阅更新的答案。谢谢,这很有效!如果站点使用http://而不是https://怎么办?是否可以修改为同时使用http://和https://?是的,请参阅更新的答案。如图所示,
httr
包将为您完成繁重的任务。重新发明轮子没有意义。如图所示,
httr
包将为您完成繁重的lfting。没有必要重新发明轮子。