在OpenRefine中,如何使用正则表达式查找/替换首字母缩写?

时间:2019-04-24 19:48:27

标签: openrefine

我有一个名称列表,这些名称的首字母是我想更改的,例如“布朗,约翰||史密斯,J S”到“布朗,约翰||史密斯,J。S”。

我认为在OpenRefine中执行此操作的方法是通过“编辑单元格/替换”。然后在使用正则表达式的“替换”中:

查找: (\,\s[A-Z]\s[A-Z]\s)

替换为: (\,\s[A-Z]\.\s[A-Z]\.\s)

但是它会产生:“布朗,约翰||史密斯(,s [A-Z] .s [A-Z] .s)”

缺少什么?任何提示将不胜感激。

1 个答案:

答案 0 :(得分:0)

当您需要在此处使用替换中的“找到的”表达式的一部分时,您需要使用“捕获组”来捕获“查找”表达式中的值,然后在替换中使用它们-所以我认为您需要的是:

查找:\,\s([A-Z])\s([A-Z])\s 替换:, $1. $2

请注意,您无需使用特殊字符或转义替换表达式。

但是,这里的危险是,这非常特定于查找两个首字母-它将失败一个首字母,并且会导致不完全替换为三个或更多首字母。

您可以编写一个更复杂的正则表达式来处理不同数量的首字母,但是我的建议是使用OpenRefine转换来完成工作。如果您做了类似的事情

编辑单元格->变换

然后使用GREL

forEach(value.split(" "),v,if(v.length()==1,v+".",v)).join(" ")

可以处理任意数量的首字母缩写。这样做是在每个空格处分割起始字符串,然后如果找到的“单词”的长度为1(即单个字符),它将在其后添加句点/句号。然后将所有“单词”重新组合成一个字符串。可以通过检查“单词”是单个大写字母而不是length == 1来改善此问题,但这说明了基本方法。

相关问题