如何在用逗号分隔的单引号之间拆分字符串?

时间:2019-07-29 04:54:02

标签: r regex single-quotes

我有一个像这样的列表对象

> bk$x[[1]]
[1] "('bk0000003', 'spbk0002530', 'Certain', 'French editions', 'Abrégé de l''Histoire générale des voyages, contenant ce qu''il y a de plus remarquable, de plus utile et de mieux avéré dans les pays où les voyageurs ont pénétré; les moeurs des habitans, la religion, les usages, arts et sciences, commerce, manufactures... Par M. de La Harpe', 'Abrégé de l''histoire des voyages; abregé de l''histoire generale des Voyages; Abrégé des voyages', NULL, NULL, 'French', 'Hôtel de Thou', NULL, 'Paris', 'Paris', '1780-1786', NULL, NULL, NULL, 23, NULL, '8', '2220', NULL, 'Attribution - only located extant edition at the time it appeared in STN accounts.'),"

我想提取用逗号分隔的单引号内的所有内容,但我的字符串在单引号内包含逗号(和引号)。我对R中的regex语法非常陌生,我的最大努力是strsplit(bk $ x [[1]],“,”)的某种变体,它显然在单引号内使用逗号。

我在stackoverflow上发现了类似的帖子(例如,hereherehere),但是这些帖子并没有达到我想要的。

我的对象(bk)包含> 4,300个列表,因此我希望自动化该过程。如有任何建议,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

一个选项是strsplit中的base R

gsub("^[^']*'|'\\),?$", "", strsplit(str1,  "'(?=,)", perl = TRUE)[[1]])

数据

str1 <- "('bk0000003', 'spbk0002530', 'Certain', 'French editions', 'Abrégé de l''Histoire générale des voyages, contenant ce qu''il y a de plus remarquable, de plus utile et de mieux avéré dans les pays où les voyageurs ont pénétré; les moeurs des habitans, la religion, les usages, arts et sciences, commerce, manufactures... Par M. de La Harpe', 'Abrégé de l''histoire des voyages; abregé de l''histoire generale des Voyages; Abrégé des voyages', NULL, NULL, 'French', 'Hôtel de Thou', NULL, 'Paris', 'Paris', '1780-1786', NULL, NULL, NULL, 23, NULL, '8', '2220', NULL, 'Attribution - only located extant edition at the time it appeared in STN accounts.'),"

答案 1 :(得分:1)

这是使用以下正则表达式模式的基本R选项:

'.*?'(?:,|$)

这将匹配所有用单引号引起来的内容,每个条目的末尾都由一个封闭的单引号引起来,然后紧跟一个逗号,则由一个单引号引起来,然后输入的结尾。这种逻辑应该解决在每个条目中都允许使用单引号和逗号的问题。

input <- "('bk0000003', 'spbk0002530', 'Certain', 'French editions', 'Abrégé de l''Histoire générale des voyages, contenant ce qu''il y a de plus remarquable, de plus utile et de mieux avéré dans les pays où les voyageurs ont pénétré; les moeurs des habitans, la religion, les usages, arts et sciences, commerce, manufactures... Par M. de La Harpe', 'Abrégé de l''histoire des voyages; abregé de l''histoire generale des Voyages; Abrégé des voyages', NULL, NULL, 'French', 'Hôtel de Thou', NULL, 'Paris', 'Paris', '1780-1786', NULL, NULL, NULL, 23, NULL, '8', '2220', NULL, 'Attribution - only located extant edition at the time it appeared in STN accounts.'"
output <- regmatches(input, gregexpr("'.*?'(?:,|$)", input, perl = TRUE))[[1]]
output <- sub("'(.*)',?$", "\\1", output)
output

 [1] "bk0000003"                                                                                                                                                                                                                                                                            
 [2] "spbk0002530"                                                                                                                                                                                                                                                                          
 [3] "Certain"                                                                                                                                                                                                                                                                              
 [4] "French editions"                                                                                                                                                                                                                                                                      
 [5] "Abrégé de l''Histoire générale des voyages, contenant ce qu''il y a de plus remarquable, de plus utile et de mieux avéré dans les pays où les voyageurs ont pénétré; les moeurs des habitans, la religion, les usages, arts et sciences, commerce, manufactures... Par M. de La Harpe"
 [6] "Abrégé de l''histoire des voyages; abregé de l''histoire generale des Voyages; Abrégé des voyages"                                                                                                                                                                                    
 [7] "French"                                                                                                                                                                                                                                                                               
 [8] "Hôtel de Thou"                                                                                                                                                                                                                                                                        
 [9] "Paris"                                                                                                                                                                                                                                                                                
[10] "Paris"                                                                                                                                                                                                                                                                                
[11] "1780-1786"                                                                                                                                                                                                                                                                            
[12] "8"                                                                                                                                                                                                                                                                                    
[13] "2220"                                                                                                                                                                                                                                                                                 
[14] "Attribution - only located extant edition at the time it appeared in STN accounts."