regex R中的正则表达式匹配字符串,但不包含我不想包含的内容

z0qdvdin  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(114)

我有这个名单的电影导演的前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)

但我总是遇到同样的问题。我如何才能只得到第一个名字与我以前指定的标准,什么算作第一个/姓氏?

s2j5cfk0

s2j5cfk01#

我为regex2想出了这个

regex2 <- ".*(?=\\s(O\\'|[Dd]e(l)?(\\sla)?|[Vv](an|on))\\s)|.*(?=(\\s(O\\'|[Dd]e(l)?(\\sla)?|[Vv](an|on))?\\s*[[:alpha:]]+\\-?[[:alpha:]]+)$)|.*"

利用或得到我需要的东西

相关问题