Regex - разделить строку на запятую, пропустить что-нибудь между сбалансированными скобками - PullRequest
0 голосов
/ 25 октября 2018

Необходимо написать регулярное выражение в R - Perl, которое разделяет строку на запятую ',', но пропускает все вхождения запятой между круглыми скобками.Задача состоит в том, чтобы гарантировать, что круглые скобки сбалансированы, т.е. закрывающая скобка отображается обратно в ее открытую скобку.

В приведенном ниже коде регулярных выражений все работает отлично, за исключением случаев, когда вы замечаете - круглые скобки не сбалансированы, внутренний конецскобка рассматривается для внешней стартовой скобки

text <- "PEANUTS (PEANUTS, PEANUT OIL AND/OR COTTONSEED OIL AND/OR CANOLA OIL AND/OR SOYBEAN OIL, SALT), GOLDEN RAISINS (RAISINS, SULFUR DIOXIDE), DRIED CRANBERRIES (CRANBERRIES, SUGAR, CITRIC ACID, SUNFLOWER OIL (PROCESSING AID), ELDERBERRY JUICE CONCENTRATE (COLOR)), ALMONDS (ALMONDS, PEANUT OIL AND/OR COTTONSEED OIL AND/OR CANOLA OIL AND/OR SOYBEAN OIL, SALT), MACADAMIAS (MACADAMIAS, MALTODEXTRIN, SALT)"

strsplit(text, '\\([^*)^)]*\\)(*SKIP)(*F)|\\,', perl=T)

При использовании приведенного выше кода регулярного выражения сушеная клюква не разделяется правильно.Пожалуйста, обратитесь к выходному скриншоту здесь: Вывод кода Regex

Любая помощь здесь будет высоко ценится .. Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Вы можете использовать

strsplit(text, "(\\((?:[^()]++|(?1))*\\))(*SKIP)(*F)|,", perl=TRUE)
# => [[1]]
[1] "PEANUTS (PEANUTS, PEANUT OIL AND/OR COTTONSEED OIL AND/OR CANOLA OIL AND/OR SOYBEAN OIL, SALT)"                            
[2] " GOLDEN RAISINS (RAISINS, SULFUR DIOXIDE)"                                                                                 
[3] " DRIED CRANBERRIES (CRANBERRIES, SUGAR, CITRIC ACID, SUNFLOWER OIL (PROCESSING AID), ELDERBERRY JUICE CONCENTRATE (COLOR))"
[4] " ALMONDS (ALMONDS, PEANUT OIL AND/OR COTTONSEED OIL AND/OR CANOLA OIL AND/OR SOYBEAN OIL, SALT)"                           
[5] " MACADAMIAS (MACADAMIAS, MALTODEXTRIN, SALT)" 

См. Демоверсию regex и онлайн-демонстрацию R .

Подробнее

  • (\\((?:[^()]++|(?1))*\\)) - группа захвата # 1, которая захватывает
    • \\( - ( char
    • (?:[^()]++|(?1))* - 0 или более вхождений1+ символов кроме ( и )[^()]++) или (|) всего шаблона группы 1 (который повторяется для соответствия всем вложенным уровням)
    • \\) - a) char
  • (*SKIP)(*F) - два глагола заставляют двигатель пропустить текущую согласованную строку и перейти к поиску следующего совпадения сразу после этого текста.
  • | - или
  • , - запятая.
0 голосов
/ 25 октября 2018

Редактирование принятого ответа на этот вопрос , кажется, делает работу.Я просто добавил [[:alpha:][:space:]]* в начале.

pat <- '[[:alpha:][:space:]]*\\(((?>[^()]+)|(?R))*\\)'
regmatches(text, gregexpr(pat, text, perl = TRUE))
#[[1]]
#[1] "PEANUTS (PEANUTS, PEANUT OIL AND/OR COTTONSEED OIL AND/OR #CANOLA OIL AND/OR SOYBEAN OIL, SALT)"                            
#[2] " GOLDEN RAISINS (RAISINS, SULFUR DIOXIDE)"                                                                                 
#[3] " DRIED CRANBERRIES (CRANBERRIES, SUGAR, CITRIC ACID, SUNFLOWER #OIL (PROCESSING AID), ELDERBERRY JUICE CONCENTRATE (COLOR))"
#[4] " ALMONDS (ALMONDS, PEANUT OIL AND/OR COTTONSEED OIL AND/OR #CANOLA OIL AND/OR SOYBEAN OIL, SALT)"                           
#[5] " MACADAMIAS (MACADAMIAS, MALTODEXTRIN, SALT)" 
...