#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)))
Вывод
['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']
Комментарии:
1. @paultop6 Я обновил ответ и объяснение шаблонов.