Как применить регулярное выражение к столбцу и сохранить группы соответствия регулярному выражению в несколько столбцов? - PullRequest
0 голосов
/ 09 октября 2019

Я использую openrefine для очистки моего набора данных. Я пытаюсь применить регулярное выражение к столбцу в моем наборе данных. Это регулярное выражение возвращает несколько подходящих групп. Я хочу сохранить эти группы в разных (соответствующих) новых столбцах. Я могу применить регулярное выражение, как это Edit column>Add column based on column. После выбора Python / Jython на языке Я помещаю свой Expression, как показано ниже:

import re 
regex = r"custom_regex"
value = re.findall(regex, value)
# Check if anything matched with the regex and if so return the first match:
if len(value)>0:
    return value[0] 
# In order to get the groups: return value[0][0], or value[0][1], or value[0][2] etc.
# If there is no match, return value (empty list)
else:
    value = "No Match" #If you want it to return a message instead of empty list
    return value

Но с помощью этого метода я могу создавать только один столбец за раз. Есть ли способ создать столбцы столько, сколько соответствует регулярному выражению группы?

1 Ответ

1 голос
/ 09 октября 2019

Вы не можете напрямую создать более одного нового столбца с помощью OpenRefine. Однако вы можете упростить ваш сценарий, используя вместо Gthon Grel:

if(value.find(/YOUR REGEX/) > 0, value.find(/YOUR REGEX/).join(|), "No match")

Метод .find() в Grel (версия OpenRefine> = 3) очень похож на re.findall() в Python.

Сохраните результат в новом столбце, затем используйте «Редактировать столбец / разделить на несколько столбцов» с каналом (|) в качестве разделителя, чтобы создать столько новых столбцов, сколько у вас есть групп.


Эквивалент Jython, вероятно, выглядит примерно так:

value = "1995 is a year"

Код

import re 
regex = r"(\d+).+?(year)"
match = re.findall(regex, value)
if match:
    return "|".join(value[0])
else:
    return "No Match" 

Результат

1995|year
...