簡體   English   中英

按 2 個不同的條件拆分字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM