Шаблон регулярного выражения с использованием скобки '[]' - PullRequest
2 голосов
/ 10 января 2020

Как можно разделить
3[a]2[b4[F]c] на 3[a] и 2[b4[F]c]
ИЛИ
3[a]2[bb] на 3[a] и 2[bb], используя re.split?

Я пробую следующий шаблон:

(\d+)\[(.*?)\]

, но вывод дает мне 3a и 2b4[F".

Ответы [ 2 ]

1 голос
/ 10 января 2020

Вы не можете сделать это с помощью re.split, поскольку re не поддерживает рекурсию.

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

import regex
s = "3[a]2[b4[F]c]"
print( [x.group() for x in regex.finditer(r'\d+(\[(?:[^][]++|(?1))*])', s)] )
# => ['3[a]', '2[b4[F]c]']

См. онлайн Python демо

Детали шаблона

  • \d+ - 1+ цифр
  • (\[(?:[^][]++|(?1))*]) - Группа 1:
    • \[ - [ char
    • (?:[^][]++|(?1))* - 0 или более последовательностей
    • [^][]++ - 1+ символов кроме [ и ] (собственно для лучшей производительности)
    • | - или
    • (?1) - группа запуска подпрограммы 1 рекурсия в этом месте
  • ] - ] char.
1 голос
/ 10 января 2020

Если вы хотите использовать split, вы можете утверждать, что слева это ], а справа - ди git:

(?<=])(?=\d)

Regex demo | Python демо

Пример кода

import re

regex = r"(?<=])(?=\d)"
strings = [
    "3[a]2[b4[F]c]",
    "3[a]2[bb]"
]

for s in strings:
    print (re.split(r'(?<=])(?=\d)', s))

Выход

['3[a]', '2[b4[F]c]']
['3[a]', '2[bb]']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...