如何在逗号分隔的单引号之间拆分字符串?
How to split strings between single quotes separated by comma?
我有一个像这样的列表对象
> 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 中的正则表达式语法还很陌生,我最大的努力是 strsplit(bk$x[[1]], ",") 的一些变体,它显然在单引号内使用了逗号。
我在 Whosebug 上找到了类似的帖子(例如,参见 , , and here),但这些帖子并不完全符合我的要求。
我的对象 (bk) 包含 >4,300 个列表,所以我很想自动化该过程。如果您有任何建议,我将不胜感激。
一个选项是 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.'),"
这是使用以下正则表达式模式的基本 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."
我有一个像这样的列表对象
> 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 中的正则表达式语法还很陌生,我最大的努力是 strsplit(bk$x[[1]], ",") 的一些变体,它显然在单引号内使用了逗号。
我在 Whosebug 上找到了类似的帖子(例如,参见
我的对象 (bk) 包含 >4,300 个列表,所以我很想自动化该过程。如果您有任何建议,我将不胜感激。
一个选项是 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.'),"
这是使用以下正则表达式模式的基本 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."