Python: разделить на (под) разделитель строк, но не в скобках? - PullRequest
2 голосов
/ 09 февраля 2020

Это очень похоже на Python: разделить строку многосимвольным разделителем, если только внутри кавычек , откуда я взял свою отправную точку.

Рассмотрим эту тестовую строку:

{{Institution Name 1} and {Institution name 2}} and {Institution name 3} and {Institution and institution name 4}

Я, в основном, хочу разделить это, поэтому я получаю (это то же самое для меня, если вмещающие скобки включены или нет):

  1. {Institution Name 1} and {Institution name 2}
  2. Institution name 3
  3. Institution and institution name 4

или (с прилагаемыми скобками):

  1. {{Institution Name 1} and {Institution name 2}}
  2. {Institution name 3}
  3. {Institution and institution name 4}

По сути, каждый набор скобок отделяет элемент, а элементы разделяются "and".

Однако элемент может состоять из нескольких предметов, которые я не хочу разбивать в первом проходе; и "and" может также отображаться как часть названия учреждения, и в этом случае я не хочу использовать его как разделитель.

Изменяя регулярное выражение из связанного поста, я придумал and (?=(?:[^{]*{[^{]*})*[^}]*$); https://pythex.org/ ( ссылка на регулярное выражение ), это приводит к следующему:

pythex-scr.png

Итак, регулярное выражение успешно избежало "and" в качестве разделителя в третьем элементе, где оно является частью названия учреждения, но оно все еще используется в качестве разделителя в первом поле, где его следует игнорировать, поскольку оно находится в наборе группирующих скобок .

Существует ли регулярное выражение Python, которое я могу использовать вместо этого, чтобы разделить определенным образом?

1 Ответ

3 голосов
/ 09 февраля 2020

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

{(?>[^{}]|(?R))*}

Это приведет к совпадениям, включая закрывающие скобки.

Здесь вы можете увидеть живой пример.


Согласно этому вопросу нужен модуль regex вместо re. Тогда рекурсия должна быть поддержана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...