正则表达式以提取URL的特定部分

时间:2017-12-04 21:47:19

标签: r regex

我有一个URL矢量,需要提取它的某个部分。我已经尝试使用正则表达式测试程序来查看我的尝试是否有效,但它们并不好。

我拥有的网址采用以下格式:https://www.baseball-reference.com/teams/MIL/1976.shtml

我想在“团队/”之后提取三个字母(所以对于上面的例子,我需要“MIL”)

有没有人知道如何获得正确的正则表达式才能使其正常工作?感谢。

4 个答案:

答案 0 :(得分:1)

1)basename / dirname 试试这个:

u <- "https://www.baseball-reference.com/teams/MIL/1976.shtml" # input data

basename(dirname(u))
## [1] "MIL"

2)sub 或使用正则表达式:

sub(".*teams/(.*?)/.*", "\\1", u)
## [1] "MIL"

3)strsplit 在/上拆分字符串并取最后一个组件。

s <- strsplit(u, "/")[[1]]
s[length(s) - 1]
## [1] "MIL"

4)gsub 由于所需的子字符串都是大写字母,并且输入中没有其他字符是gsub,这将删除所有非大写字母的字符:

gsub("[^A-Z]", "", u)
## [1] "MIL"

答案 1 :(得分:0)

使用regexp实现此目的的许多不同方法。这是一个:

url <- "https://www.baseball-reference.com/teams/MIL/1976.shtml"

gsub(".+teams/(\\w{3}).+$", "\\1", url);
#[1] "MIL"

答案 2 :(得分:0)

或者

x <- c('https://www.baseball-reference.com/teams/MIL/1976.shtml')
pattern <- "/teams/([^/]+)"
m <- regexec(pattern, x)
res = regmatches(x, m)[[1]]
res[2]

产生

[1] "MIL"

答案 3 :(得分:0)

在处理字符串时,请考虑使用stringr包来简化代码。

使用带有positive lookbehind的正则表达式来捕获字符串&#34;团队之后的字母数字代码\&#34;:

stringr::str_extract(url, "(?<=teams\\/)[A-Z]*")

在您的情况下,如果URL实际上都以相同的字符串https://www.baseball-reference.com/teams/开头,那么您可以完全避免使用正则表达式并使用简单的子字符串来获取后面的三字母代码:

stringr::str_sub(url, 42, 44)

结果如下:

> url <- "https://www.baseball-reference.com/teams/MIL/1976.shtml"
> 
> stringr::str_extract(url, "(?<=teams\\/)[A-Z]*")
[1] "MIL"
> 
> stringr::str_sub(url, 42, 44)
[1] "MIL"