【问题标题】:Find pattern in URL with stringr and regex使用 stringr 和正则表达式在 URL 中查找模式
【发布时间】:2017-05-06 06:32:37
【问题描述】:

我有一个带有一些 url 的数据框 df。我想用 stringr 和 str_extract 提取的 URL 中的斜杠中有子类别

我的数据看起来像

Text         URL
Hello        www.facebook.com/group1/bla/exy/1234
Test         www.facebook.com/group2/fssas/eda/1234
Text         www.facebook.com/group-sdja/sdsds/adeds/23234
Texter       www.facebook.com/blablabla/sdksds/sdsad

我现在想提取 .com/ 和下一个 / 之后的所有内容

我试过suburlpattern <- "^.com//{1,20}//$"df$categories <- str_extract(df$URL, suburlpattern)

但我只在 df$categories 中得到 NA

知道我在这里做错了什么吗?这是我的正则表达式代码吗?

非常感谢任何帮助!非常感谢事先。

【问题讨论】:

  • ^ 在正则表达式模式中意味着它只匹配字符串的开头。由于.com 不在网址的开头,因此您的模式将不匹配。你可能不需要^
  • 感谢 Amber,但不幸的是,它仍然只给我 NA... 还有其他想法吗?

标签: r regex extract stringr


【解决方案1】:

如果你想使用str_extract,你需要一个正则表达式,它可以在整个匹配中获得你需要的值,你需要一个(?<=[.]com/)lookbehind:

(?<=[.]com/)[^/]+

请参阅regex demo

详情

  • (?&lt;=[.]com/) - 当前位置必须以.com/ 子字符串开头
  • [^/]+ - 匹配除 / 之外的 1 个或多个字符。

R 演示:

> URL = c("www.facebook.com/group1/bla/exy/1234", "www.facebook.com/group2/fssas/eda/1234","www.facebook.com/group-sdja/sdsds/adeds/23234", "www.facebook.com/blablabla/sdksds/sdsad")
> df <- data.frame(URL)
> library(stringr)
> res <- str_extract(df$URL, "(?<=[.]com/)[^/]+")
> res
[1] "group1"     "group2"     "group-sdja" "blablabla"

【讨论】:

    【解决方案2】:

    这将返回第一组正斜杠之间的所有内容

    library(stringr)
    str_match("www.facebook.com/blablabla/sdksds/sdsad", "^[^/]+/(.+?)/")[2]
    
    [1] "blablabla"
    

    【讨论】:

    • 您可以将所有\\/ 替换为/,因为正斜杠不是特殊的正则表达式元字符。
    【解决方案3】:

    这行得通

    library(stringr)
    data <- c("www.facebook.com/group1/bla/exy/1234", 
              "www.facebook.com/group2/fssas/eda/1234",
              "www.facebook.com/group-sdja/sdsds/adeds/23234",
              "www.facebook.com/blablabla/sdksds/sdsad")
    
    suburlpattern <- "/(.*?)/" 
    categories <- str_extract(data, suburlpattern)
    str_sub(categories, start = 2, end = -2)
    

    结果:

    [1] "group1" "group2" "group-sdja" "blablabla"

    只会让你得到第一个和第二个斜线之间的内容......但这似乎是你想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-31
      • 1970-01-01
      • 2015-07-20
      • 2016-08-31
      • 1970-01-01
      • 2016-08-16
      • 2023-01-28
      • 1970-01-01
      相关资源
      最近更新 更多