Регулярное выражение, которое может сопоставить [k = v] с рекурсией? - PullRequest
0 голосов
/ 27 ноября 2018

Я хочу написать регулярное выражение Python2 для следующего случая. Я еще не выполнил анализ осуществимости :

  • example_input_string: the quick [brown_1=fox] jumps over the [lazy=dog]
  • list_of_regex_matches: ["[brown_1=fox]", "[lazy=dog]"]

По сути, я хотел бы сопоставить все подстроки [\w+=.*] и вывести их в виде списка.Кажется, что API, который я хотел бы использовать здесь, это re.findall, но каково правильное регулярное выражение для этого в Python2?

В этом конкретном случае подстроки [brown_1=fox] и [lazy=dog] индивидуальносоответствует регулярному выражению: [\w+=.*].

ПРИМЕЧАНИЕ: РАЗРЕШЕНЫ следующие входные строки: the quick [brown=[fox[a=b][c=d]]] jumps over.то есть в пределах одного элемента, который соответствует [\w+=.*], символы [, ] и = могут появиться снова.Но гарантируется, что ДО первого «равного» символа присутствуют только буквенно-цифровые символы и символы подчеркивания.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Вы можете установить альтернативный regex модуль , который поддерживает шаблон рекурсии (?R), так что вы можете использовать метод findall() следующим образом:

import regex
s = 'the quick [brown=[fox[a=b][c=d]]] jumps over the [lazy=dog]'
print(regex.findall(r'\[(?>[^[\]]|(?R))*\]', s))

Это выводит:

['[brown=[fox[a=b][c=d]]]', '[lazy=dog]']
0 голосов
/ 27 ноября 2018

Я думаю, вам нужен простой конечный автомат для этого

def parse(s):
    stack = []
    parts = []
    current = []
    for c in s:
      if c == "[":
        current.append("")
        stack.append(c)
      elif c == "]" and stack:
        stack.pop()
        parts.insert(0,current.pop())
      elif stack:
        current[-1] += c
    return parts

print(parse("the quick [brown=[fox[a=b][c=d]]] jumps over"))
# ['brown=', 'fox', 'c=d', 'a=b']
...