我有这个名单的电影导演的前250名用户评价电影在imdb上获得这样的
doc <- GET("https://www.imdb.com/chart/top")
pagetext <- content(doc, as = "text")
directors <- str_extract_all(pagetext, '(?<=")[^"]*(?=\\s\\(dir\\.\\))')
dir_table <- sort(table(directors), decreasing = TRUE)
dir_250 <- data.frame(dir_table)
这是一个导演的数据框架,以及他们在名单上出现的次数。我添加了我自己的假导演,用一个名字“比利”来确保我所做的工作对一个名字有效。我决定把一个名字作为第一个名字的一部分。
dir_250$directors <- as.character(dir_250$directors)
dir_250 <- rbind(dir_250, c("Billy", 1))
查到姓氏效果很好我是这样做的
regex1 <-
"((?<=\\s)(O\\'|[Dd]e(l)?(\\sla)?|[Vv](an|on))?\\s*[[:alpha:]]+\\-?[[:alpha:]]+)$"
str_extract(dir_250$directors, regex1)
这就像我希望比利作为NA和所有其他人与他们的预期姓氏。问题来了,当我试图得到第一个名字。NA是打算,而不是一个问题。
我尝试过这种方法
regex2 <-
".*(?=(\\s(O\\'|[Dd]e(l)?(\\sla)?|[Vv](an|on))?\\s*[[:alpha:]]+\\-?[[:alpha:]]+)$)"
str_extract(dir_250$directors, regex2)
来展示我的问题的一个较小的例子
names <- c("Gus Van Sant", "George Roy Hill", "Paul Thomas")
str_extract(names, regex1)
#[1] "Van Sant" "Hill" "Thomas"
完全按照计划但是
names <- c("Gus Van Sant", "George Roy Hill", "Paul Thomas")
str_extract(names, regex2)
#[1] "Gus Van" "George Roy" "Paul"
不像预期的那样。我想要“Gus”“乔治Roy”“Paul”。我的问题是它在第一个名字中包含了de,von和货车之类的东西。我尝试了许多修复方法,包括
regex2 <-
".*(?=(O\\'|[Dd]e(l)?(\\sla)?|[Vv](an|on))?)(?=(\\s(O\\'|[Dd]e(l)?(\\sla)?|[Vv](an|on))?\\s*[[:alpha:]]+\\-?[[:alpha:]]+)$)"
str_extract(dir_250$directors, regex2)
但我总是遇到同样的问题。我如何才能只得到第一个名字与我以前指定的标准,什么算作第一个/姓氏?
1条答案
按热度按时间s2j5cfk01#
我为regex2想出了这个
利用或得到我需要的东西