在特定单词后按逗号拆分字符串

4

我有一个包含名称的向量,例如:

names <- "Jansen, A., Karel, A., Jong, A. de, Pietersen, K."

我希望按照姓名来拆分此信息。在这种情况下,我需要按.,和后面的逗号(该名称将是典型的荷兰名称A. De Jong)来拆分向量。

目前,我的做法是:

 strsplit(names,split="\\.\\,|\\<de\\>,")

但是这也会从名称中移除de
[[1]]
[1] "Jansen, A"      " Karel, A"      " Jong, A. "     " Pietersen, K."

我该如何获得以下结果?
[[1]]
[1] "Jansen, A"      " Karel, A"      " Jong, A. de"     " Pietersen, K."
3个回答

5

polishchuk的正则表达式需要进行两处修改才能在R中正常工作。

首先,反斜杠需要转义。其次,调用strsplit函数需要使用参数perl = TRUE来启用lookbehind。

strsplit(names, split = "\\.,|(?<=de)", perl = TRUE)

提供所被Sacha要求的答案。

需要注意的是,这仍然包括de Jong姓中的点,并且不能扩展到类似van、der等的替代方案。我建议采用以下替代方案。

names <- "Jansen, A., Karel, A., Jong, A. de, Pietersen, K., Helsing, A. van"
#split on every comma
first_last <- strsplit(names, split = ",")[[1]]
#rearrange into a matrix with the first column representing last names, 
#and the second column representing initials
first_last <- matrix(first_last, byrow = TRUE, ncol = 2) 
#clean up: remove leading spaces and dots
first_last <- gsub("^ ", "", first_last)
first_last <- gsub("\\.", "", first_last)
#combine columns again
apply(first_last, 1, paste, collapse = ", ")

我本应该知道,在R中帮助“正则表达式”时,隐含着lookaround是“Perl的东西”。Lookarounds在“类似Perl的正则表达式”部分进行描述。事物最好藏在明处。 :) - Roman Luštrik
我只是将它更改为 \\.,|(?<= de), 以避免包含 de 的名称破坏它。 - Sacha Epskamp

3
尝试使用这个正则表达式:\.,|(?<=de), 带有回顾后查。
它将匹配以下内容:
Jansen, A., Karel, A., Jong, A. de, Pietersen, K.

感谢您的输入。我最接近的方法是使用方括号和转义符,\\.\\,|[?<=de], 但只能保留 d 而不能保留 de - Sacha Epskamp
@Sacha Epskamp,顺便说一下,我认为你的正则表达式引擎不支持向前/向后查找。 - Kirill Polishchuk
@Roman 你是指 \\.,|\\(?<=de\\), 吗?对我不起作用。\\.,|(?<=de), 报错“无效的正则表达式”,我猜这是 R 的问题。 - Sacha Epskamp
@Sacha Epskamp,疲倦的分钟... :-) - Kirill Polishchuk
@Sacha, polishchuk:R运行两个不同的正则表达式引擎。您需要设置perl = TRUE以启用后顾。请参见我的答案。 - Richie Cotton
显示剩余9条评论

1

我刚刚想出了一个非常简单的解决方法,可以用于此问题,现在在这里发布供参考。只需首先使用gsub将字符串替换为更容易分割的内容:

names <- "Jansen, A., Karel, A., Jong, A. de, Pietersen, K."

names <- gsub("\\<de\\>,","de.,",names)
strsplit(names,split="\\.\\,")
[[1]]
[1] "Jansen, A"      " Karel, A"      " Jong, A. de"   " Pietersen, K."

我想这需要为每种可能出现的情况单独编写一个gsub()语句(在荷兰语中有van、der、de、te、ten等),所以这不是理想的解决方案,但可以完成工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接