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

问题描述 投票:0回答:1

我有一个名称列表,其中包含我要更改的首字母缩写,例如: “Brown,John || Smith,J S”to“Brown,John || Smith,J。S.”

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

发现:(\,\s[A-Z]\s[A-Z]\s)

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

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

少了什么东西?任何提示将非常感激。

openrefine
1个回答
0
投票

当你需要在替换中使用部分'found'表达式时,你需要使用'capture groups'来捕获'find'表达式中的值,然后在替换中使用它们 - 所以我想你需要什么是:

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

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

然而,这里的危险在于,这非常特定于找到两个首字母 - 它将在一个首字母中失败并且将导致具有三个或更多首字母的不完全替换。

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

编辑单元格 - >转换

然后使用GREL

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

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

© www.soinside.com 2019 - 2024. All rights reserved.