Использование Regex для выбора нескольких шаблонов предложений - проблема с группировкой? - PullRequest
0 голосов
/ 13 января 2019

У меня проблемы с оператором Regex, который я хочу использовать в R для извлечения полных совпадений шаблона из фрейма данных.

У меня есть 11 шаблонов предложений, и я хочу иметь возможность выбрать только записи, соответствующие этим шаблонам, из моего фрейма данных в качестве полных совпадений с использованием одного регулярного выражения (я смог заставить это работать с несколькими регулярными выражениями, но это реально хлопот). Буду признателен за любую помощь в том, что я могу сделать, чтобы просто это.

Это мои предложения:

  • Изменение заголовков с 0101 по 0106 из любой другой главы.
  • Изменение в подзаголовках с 0712.20 по 0712.39 из любой другой главы.
  • Изменение в заголовок 0903 из любой другой главы.
  • Изменение подзаголовка 1806.20 с любого другого заголовка.
  • Изменение в подзаголовок 1207.99 из любой другой главы.
  • Изменение в заголовок 4302 из любого другого заголовка.
  • Изменение подзаголовка 4105.10 с заголовка 4102 или любой другой главы.
  • Изменение подзаголовка 4105.30 с заголовка 4102, подзаголовка 4105.10 или любой другой главы.
  • Изменение подзаголовка 4106.21 с подзаголовка 4103.10 или любой другой главы.
  • Изменение подзаголовка 4106.22 с подзаголовков 4103.10 или 4106.21 или любой другой главы.
  • Изменение в позиции тарифа 7304.41.30 из подзаголовка 7304.49 или любое другое другая глава.

Это Regex, который у меня есть сейчас, который выбирает полные совпадения и частичные совпадения (где я застрял) - так что я получаю записи, которые мне не нужны, из моего фрейма данных в дополнение к этим предложениям (я знаю это грязный, просто пример).

^A change to (?:headings|heading|subheadings|subheading|tariff item) (?:\d+\S\d+\S\d+|\d+\S\d+) (?:through \d+\S\d+ from any other chapter.|from any other chapter.|from any other heading.|)|from heading \d+\S\d+ or any other chapter.|from (?:heading|subheading|subheadings) \d+\S\d+|, subheading \d+\S\d+ or any other chapter| or any other chapter.| or \d+\S\d+

Это то, как далеко я могу получить Regex как полные совпадения по всем 11 предложениям. У меня проблема с продолжением группы очистки после этого:

^A change to (?:tariff item|headings|heading|subheading|subheadings) (?:\d+\S\d+|\d+\S\d+\S\d+|\d+\S\d+) (?:from|through) 

enter image description here

1 Ответ

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

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

rx <- "A\\s+change\\s+to\\s+(?:(?:sub)?headings?|tariff\\s+item)\\s+\\d[0-9.]*(?:\\s+through\\s+\\d[0-9.]*)?\\s+from(?:(?:,?\\s+(?:sub)?headings?\\s+\\d[0-9.]*)+(?:\\s+or\\s+\\d[0-9.]*)*\\s+or)?\\s+any\\s+other\\s+(?:heading|chapter)\\."

См. Демоверсию regex . Обратите внимание, что \s+ соответствует 1 или более пробелам и будет совпадать, даже если число и тип пробела между словами не постоянны.

Подробнее

  • A\\s+change\\s+to\\s+ - A change to подстрока
  • (?:(?:sub)?headings?|tariff\\s+item) - subheading, subheadings, heading, headings, tariff item подстроки
  • \\s+\\d[0-9.]* - 1+ пробелов, 1 цифра и 0 или более цифр или .
  • (?:\\s+through\\s+\\d[0-9.]*)? - необязательная последовательность:
    • \\s+ - 1+ пробелов
    • through - through
    • \\s+ - 1+ пробелов
    • \\d[0-9.]* - 1 цифра и 0 или более цифр или .
  • \\s+from - 1+ пробелов и from
  • (?:(?:,?\\s+(?:sub)?headings?\\s+\\d[0-9.]*)+(?:\\s+or\\s+\\d[0-9.]*)*\\s+or)? - необязательная последовательность:
    • (?:,?\\s+(?:sub)?headings?\\s+\\d[0-9.]*)+ - 1 или более последовательностей:
      • ,? - опционально ,
      • \\s+
      • (?:sub)?headings? - необязательный sub, затем heading, а затем необязательный s
      • \\s+ - 1+ пробелов
      • \\d[0-9.]* - цифра, а затем 0+ цифр или . символов
    • (?:\\s+or\\s+\\d[0-9.]*)* - 0 или более последовательностей:
      • \\s+ - 1+ пробелов
      • or\\s+\\d[0-9.]* - or, 1+ пробелов, цифра и затем 0+ цифр или . символов
    • \\s+or - 1+ пробелов и or
  • \\s+any\\s+other\\s+(?:heading|chapter)\\. - any other heading. или any other chapter.

Все 11 матчей возвращаются в этой онлайн-демонстрации R :

text <- "A change to headings 0101 through 0106 from any other chapter.
A change to subheadings 0712.20 through 0712.39 from any other chapter.
A change to heading 0903 from any other chapter.
A change to subheading 1806.20 from any other heading.
A change to subheading 1207.99 from any other chapter.
A change to heading 4302 from any other heading.
A change to subheading 4105.10 from heading 4102 or any other chapter.
A change to subheading 4105.30 from heading 4102, subheading 4105.10 or any other chapter.
A change to subheading 4106.21 from subheading 4103.10 or any other chapter.
A change to subheading 4106.22 from subheadings 4103.10 or 4106.21 or any other chapter.
A change to tariff item 7304.41.30 from subheading 7304.49 or any other chapter."
rx <- "A\\s+change\\s+to\\s+(?:(?:sub)?headings?|tariff\\s+item)\\s+\\d[0-9.]*(?:\\s+through\\s+\\d[0-9.]*)?\\s+from(?:(?:,?\\s+(?:sub)?headings?\\s+\\d[0-9.]*)+(?:\\s+or\\s+\\d[0-9.]*)*\\s+or)?\\s+any\\s+other\\s+(?:heading|chapter)\\."
regmatches(text, gregexpr(rx, text))
...