如何在openrefine GREL替换中执行动态正则表达式?

问题描述 投票:2回答:2

我正在尝试从当前单元格(这是歌曲名称)中以不区分大小写的方式删除单元格“ artist”的值。我知道replace()可以使用正则表达式作为参数(https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#replacestring-s-string-f-string-r),并且我可以将(?i)用于不区分大小写的模式。

但是replace()如何知道其参数是正则表达式还是纯字符串?我见过的所有示例都使用/.../表示正则表达式,但是我需要通过连接单元格artist来制作“动态”正则表达式。所以这些不起作用:

 value.replace('(?i)'+cells['artist'].value+,"")
 value.replace('((?i)'+cells['artist'].value+')',"")
 value.replace('/(?i)'+cells['artist'].value+'/',"")

我更喜欢使用GREL,但是使用Python / jython的解决方案也可以。谢谢!

replace case-insensitive openrefine grel
2个回答
1
投票

如果您可以使用Python,那么您应该可以执行以下操作:

import re
regex = re.compile('(?i)'+cells['artist'].value)
return regex.sub('', value)

(我没有检查它是否真的有效!)


0
投票

设置“不区分大小写”模式的一种更方便的方法是在正则表达式后添加ivalue.replace(/Michael Jackson/i, "")(不确定是否记录了此功能)

但是这不适用于像cells.artist.value这样的变量。我不知道为什么正如Pintoch所说,最简单的方法是使用类似以下脚本的Python / Jython:

import re
regex = re.compile(cells['artist'].value, re.I) #case insensitive

return regex.sub('', value)
© www.soinside.com 2019 - 2024. All rights reserved.