Сопоставление нескольких экземпляров шаблона в круглых скобках

#python-3.x #regex

#python-3.x #регулярное выражение

Вопрос:

Для следующей строки возможно ли, чтобы регулярное выражение возвращало совпадения, разделенные запятыми, в квадратных скобках?

 "root.path.definition[id=1234,test=blah,scope=A,B,C,D]"
 

Ожидаемый результат будет:

 ["id=1234", "test=blah", "scope=A,B,C,D"]
 

Самое близкое, что я получил до сих пор, это следующее:

 (?<=[)(.*?)(?=])
 

Но это вернет только одно совпадение для всего, что заключено в квадратные скобки.

Комментарии:

1. Что это за инструмент или язык?

2. python3 с использованием модуля re

Ответ №1:

Один из вариантов — использовать модуль re и сначала получить часть между квадратными скобками, используя группу захвата и класс отрицаемых символов.

 [([^][]*)]
 

Эта часть будет соответствовать:

  • [ Сопоставление [ символа
  • ([^][]*) Группа захвата 1, сопоставьте 0 раз любой символ, отличный от [ и ]
  • ] Символ [

Затем получите отдельные части, сопоставив пары ключ-значение, разделенные запятой.

 w =.*?(?=,w =|$)
 

Эта часть будет соответствовать:

  • w Сопоставление символов 1 word
  • = Сопоставление буквально
  • .*?(?=,w =|$) Сопоставляйте как можно меньше символов, пока не встретите запятую, символы 1 word и = / или конец строки

Например

 import re

s = "root.path.definition[id=1234,test=blah,scope=A,B,C,D]"

m = re.search(r"[([^][]*)]", s)
if m:
    print(re.findall(r"w =.*?(?=,w =|$)", m.group(1)))
 

Демонстрация Python

Вывод

 ['id=1234', 'test=blah', 'scope=A,B,C,D']
 

Если вы можете использовать модуль регулярных выражений, это также может быть вариантом сопоставления ключей и значений с использованием поиска для утверждения [ и ]

 (?<=[[^][]*)w =.*?(?=,w =|])(?=[^][]*])
 

Например

 import regex

s = "root.path.definition[id=1234,test=blah,scope=A,B,C,D]"

print(regex.findall(r"(?<=[[^][]*)w =.*?(?=,w =|])(?=[^][]*])", s))
 

Вывод

 ['id=1234', 'test=blah', 'scope=A,B,C,D']
 

Демонстрация регулярных выражений | Демонстрация Python

Комментарии:

1. @paultop6 Я обновил ответ и объяснение шаблонов.