[英]Splitting a string by 2 different conditions
我有一個名稱列表(著名導演),格式為 First,(可能的中間)和 Last Name,我需要重新排列以具有 Last Name,First(可能的中間)。 我不能只用第一個空格甚至第二個空格來分割所有這些,因為有些姓氏實際上有兩個單詞。
這是我正在使用的列表的簡短示例,其中顯示了一些棘手的情況:
> directors.names
[1] "Frank Darabont," "Francis Ford Coppola,"
[3] "Christopher Nolan," "Carl Theodor Dreyer,"
[5] "Peter Jackson," "Quentin Tarantino,"
[7] "John G. Avildsen," "David Fincher,"
[9] "Christopher Nolan," "Peter Jackson,"
[11] "Lana Wachowski," "Martin Scorsese,"
[13] "Akira Kurosawa," "Bong Joon Ho,"
[14] "Fernando Meirelles," "Florian Henckel von Donnersmarck,"
在這個例子中,我需要在 G. 之后拆分“John G. Avildsen”,然后在第一個空格之后拆分“Bong Joon Ho”,更重要的是,在第二個空格之后拆分“Florian Henckel von Donnersmarck”(只是為了指出一對)。
我在所有字符串的末尾添加了一個逗號,這樣我就可以轉置字符串並讓它返回姓氏,第一個(可能是中間)格式。
我瀏覽了我的列表,發現所有需要保留姓氏部分的東西才能嘗試的情況,這些情況首先拆分,但它並沒有在我需要的地方拆分,它只是將每個字符串拆分為它是自己的索引。
這是我現在所擁有的:
directors.names <- paste0(directors.1, ",")
directors.names <- strsplit(directors.names, "[[:space:]]+('von'|'Ford'|'Joon'|'De'|'del'|'Van')[[:space:]]+", perl = TRUE)
一旦我能讓它正常工作,我就需要刪除所有重復的名稱
我們知道要提取的模式(第一個單詞,最后一個單詞,有時是兩個單詞的姓氏),因此我們可能會使用extract
而不是split
方法更好,因為我們不知道每個名字的單詞數(在第 n 個空格上拆分會很困難)。
我們可以為常見的兩個單詞的姓氏定義一個模式,然后在str_extract_all
中插入這個模式用glue::glue
。
在以下對str_extract_all
的調用中,我們定義了 3 種可能的提取模式:
^\\w+
(({two_word_patterns})\\s+\\w+$)
\\w+$
這三個應該用|
折疊作為分隔符,都在正則表達式中(中間沒有刻度)。
提取名稱后,我們可以使用rev()
反轉順序,最后使用toString
將它們粘貼回去。
當我們需要使用“,”分隔符paste
字符元素時, toString
特別有用,就像在這種情況下一樣。
library(glue)
library(stringr)
libyrar(purrr)
two_word_patterns<-'(von)|(Ford)|(Joon)|(De)|(del)|(Van)'
directors<-c("Fernando Meireles", "Bong Joon Ho", "Florian Henckel von Donnersmarck")
directors %>% str_extract_all(pattern = glue('^\\w+|(({two_word_patterns})\\s+\\w+$)|\\w+$'))%>%
map(rev) %>%
map(toString)
[[1]]
[1] "Meireles, Fernando"
[[2]]
[1] "Joon Ho, Bong"
[[3]]
[1] "von Donnersmarck, Florian"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.