Существует ли регулярное выражение для поиска строки между двумя косыми чертами и после определенной строки? [Р] - PullRequest
2 голосов
/ 31 марта 2019

У меня есть фрейм данных со столбцом, который содержит URls, например:

https://www.facebook.com/nameofpage/posts/13142894231

Я пытаюсь извлечь только часть nameofpage этого столбца в новый столбец.Я не могу понять, как извлечь строку в этой точной позиции.Строка иногда содержит литерал ".", Текст и цифры.

Я пытался использовать strsplit и separate из тидира с ограниченным успехом.

Код тидира выглядит следующим образом:

  separate(Link, c(NA, NA, NA, "target"), sep = "/")

Однако, это действительно не работает вообще.

Я ожидал бы извлечь nameofpage в столбец, но иногда вывод - это фактически другая часть URL.

Ответы [ 5 ]

2 голосов
/ 31 марта 2019

Вы можете использовать str_split из пакета stringr.

URL = "https://www.facebook.com/nameofpage/posts/13142894231"

library(stringr)

str_split(URL, "/")
[[1]]
[1] "https:"           ""                 "www.facebook.com" "nameofpage"      
[5] "posts"            "13142894231"     

str_split(URL, "/")[[1]][4]
[1] "nameofpage"
1 голос
/ 31 марта 2019

Вы можете написать пользовательскую функцию для работы со строками:

get.nameofpage = function(string){
  (unlist(strsplit(string, "\\/")))[4]
}

# Example
my.string = "https://www.facebook.com/nameofpage/posts/13142894231"
> get.nameofpage(my.string)
[1] "nameofpage"
1 голос
/ 31 марта 2019

Кроме того, есть также str_match, который будет возвращать совпадающие группы в регулярном выражении:

str_match(url, "://(.*?)/(.*?)(\/|$)")[,2]
0 голосов
/ 31 марта 2019

Существует некоторый вопрос относительно того, что именно мы знаем о положении желаемого поля, но если мы знаем, что это 4-е / -отделенное поле или 3-е от последнего, мы можем использовать (1) или (2) соответственно. (Если ни один из них не может быть принят, пожалуйста, уточните, как мы знаем, какое поле желательно.)

1) read.table Используя вектор символов ss в примечании ниже в качестве ввода, мы можем использовать read.table, если мы знаем, что нужное поле находится между третьей и четвертой косой чертой.

read.table(text = ss, sep = "/", fill = TRUE, as.is = TRUE)[[4]]
## [1] "nameofpage" "nameofpage"

1a) Использование separate:

library(tidyr)

separate(data.frame(ss), ss, c(NA, NA, NA, "target"), sep = "/", extra = "drop")
##       target
## 1 nameofpage
## 2 nameofpage

2) dirname / basement Мы можем использовать dirname и basename, если мы знаем, что требуемое поле является третьим прошедшим полем:

basename(dirname(dirname(ss)))
## [1] "nameofpage" "nameofpage"

Примечание

s <- "https://www.facebook.com/nameofpage/posts/13142894231"
ss <- c(s, s)
0 голосов
/ 31 марта 2019

Вы можете использовать gsub.Это возвращает по крайней мере один + символ после .com, который не является косой чертой [^/]:

link <- "https://www.facebook.com/nameofpage/posts/13142894231"

gsub("^.*\\.com/([^/]+).*", "\\1", link)
[1] "nameofpage"

Примечание: это будет работать только для URL с ".com" (т.е. этоне будет работать для других доменов .edu, .org и т. д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...