链接格式多变时,如何用substr()提取目标子串?
解决URL中灵活提取项目名称的问题
嘿,这个问题我刚好处理过!不用死磕substr()的固定起始结束位置——毕竟URL的前缀长度不固定(带www.是11字符,不带是8字符),用正则表达式来灵活匹配才是最优解,既能适配带不带www.的情况,还能轻松提取你要的项目名。
方法1:基础R实现(无需额外包)
直接用基础R的sub()函数结合正则,就能一步到位:
list <- c("https://www.gatcoin.io/wp-content/uploads/2017/08/GATCOIN-Whitepaper_ENG-1.pdf", "https://appcoins.io/pdf/appcoins_whitepaper.pdf", "https://pareto.network/download/Pareto-Technical-White-Paper.pdf", "http://betbox.ai/BetBoxBizWhitepaper.pdf", "https://www.aidcoin.co/assets/documents/whitepaper.pdf") # 正则匹配+转小写 result <- tolower(sub("^https?://(www\\.)?(.*?)\\..*", "\\2", list)) print(result)
正则规则解释:
^https?://:匹配URL开头的http://或https://(?表示s是可选的)(www\\.)?:匹配可选的www.部分(?表示这一段可有可无)(.*?):非贪婪匹配,提取到第一个.之前的所有内容(也就是我们要的项目名)\\..*:匹配第一个.之后的所有内容(域名后缀+文件路径)\\2:引用正则中第二个捕获组的内容(就是我们提取到的项目名)tolower():把结果转成小写,完全符合你的期望输出
方法2:用stringr包(更直观的tidyverse风格)
如果你习惯用tidyverse系列工具,stringr包的str_extract()会更直观:
library(stringr) result <- tolower(str_extract(list, "(?<=https?://(www\\.)?)[^.]+")) print(result)
正则规则解释:
(?<=https?://(www\\.)?):正向回顾断言,确保提取的内容前面是http(s)://或http(s)://www.[^.]+:匹配所有不是.的字符,直到遇到第一个.,刚好就是项目名
两种方法的输出都是你想要的:
[1] "gatcoin" "appcoins" "pareto" "betbox" "aidcoin"
内容的提问来源于stack exchange,提问作者Carolin
相关产品推荐
相关产品推荐

