Соответствие только процентным значениям в Redshift Regex - PullRequest
0 голосов
/ 24 января 2019

У меня проблемы с довольно сложной проблемой регулярных выражений в Redshift.Я хочу быть в состоянии извлечь все числовые значения, которые имеют знак процента после них и ни одно из тех, которые не делают.Мой текущий сценарий работает для более простых примеров, но не для более сложных.

У меня есть колонка, в которой есть ингредиенты для напитков.

Простым примером может быть "95% Apple, 5% Grape" или 50.25% grape, 49.75% apple.Я могу разобрать это с '[0-9]+(\.[0-9][0-9]?%)?'.Однако более сложные примеры, такие как "50% Apple, 50% Grape, 2mg grape juice" или "100% Juice,50% Apple, 50% Grape", приводят к тому, что я извлекаю "2" and 100, 50, and 50, соответственно.

[0-9]+(\.[0-9][0-9]?%)?

Мне удалось захватить каждую цифру, но я хочу получать цифры только со знаком процента сразу после него, где значение "100%"не с другими процентными значениями.Таким образом, используя этот пример "100% Juice,50% Apple, 50% Grape", я хочу только два значения 50%.Изменить: Я также хочу уточнить, что я использую функцию regexp_substr, поэтому два значения 50% будут в своих собственных столбцах с использованием индекса.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Вот ответ, используя питон udf

create or replace function process_percentages(InputStr varChar)
  returns varchar
stable
as $$
    import re
    OutputStr = ''
    pattern=re.compile('(\d+(\.\d+)?%)')
    if ('100%' in InputStr) & (InputStr.count('%') == 1):
        OutputStr='100%,'
    else:
        for m in re.finditer(pattern, InputStr):
            if float(m.group(1)[:-1]) < 100.0:
                OutputStr+=m.group(1) + ','
    return OutputStr[:-1]
$$ language plpythonu;

тогда вы можете использовать его как:

Select process_percentages('10% Apple, 10% 5% Grape');
Select process_percentages('100% 10% Apple, 10% 5% Grape');
Select process_percentages('123% nothing 10% Apple, 10% Grape');
Select process_percentages('100% Apple, Grape');
Select process_percentages('10.56% Apple, 5.22% Grape');

Это всегда будет работать и легко адаптируется, если ваши потребности станут немного сложнее.

Вы должны сначала выполнить https://docs.aws.amazon.com/redshift/latest/dg/udf-security-and-privileges.html, чтобы получить разрешения

0 голосов
/ 24 января 2019

Вы можете использовать что-то вроде ниже

\b\d?\d%\s
https://regex101.com/r/wxGfaX/1

...