Как получить все совпадающие итерации для группы захвата - PullRequest
0 голосов
/ 29 мая 2019

Я сделал это регулярное выражение и использую его с re.findall ():

SELECT.*{(?:\[([a-zA-Z0-9 ]*)\]\.\[([a-zA-Z0-9 ]*)\]\.\[([a-zA-Z0-9 ]*)\][,]{0,1}){1,}}.*

made with https://jex.im

, чтобы сопоставить эти списки строк:

["dimSales", "Название продукта", "Все"], ["test", "Название продукта", "Все"]

в этом стоге сена:

SELECT NON EMPTY Hierarchize({DrilldownLevel({[dimSales].[Product Title].[All],[test].[Product Title].[All]},,,INCLUDE_CALC_MEMBERS)}) DIMENSION PROPERTIES PARENT_UNIQUE_NAME,HIERARCHY_UNIQUE_NAME ON COLUMNS FROM [Model] CELL PROPERTIES VALUE, FORMAT_STRING, LANGUAGE, BACK_COLOR, FORE_COLOR, FONT_FLAGS

мое регулярное выражение соответствует только последней итерации внешней группы захвата

["test", "Product Title", "All"]

что мне нужно изменить, поэтому re.findall () возвращает все итерации.Не только последняя итерация внешней группы захвата?

Ответы [ 2 ]

0 голосов
/ 29 мая 2019
string = "SELECT NON EMPTY Hierarchize({DrilldownLevel({[dimSales].[Product Title].[All],[test].[Product Title].[All]},,,INCLUDE_CALC_MEMBERS)}) DIMENSION PROPERTIES PARENT_UNIQUE_NAME,HIERARCHY_UNIQUE_NAME ON COLUMNS FROM [Model] CELL PROPERTIES VALUE, FORMAT_STRING, LANGUAGE, BACK_COLOR, FORE_COLOR, FONT_FLAGS"

print re.findall(r"(?:SELECT .+\({|,)\[([\w ]+)\]\.\[([\w ]+)\]\.\[([\w ]+)\](?=[^}]*})",  string)

Вывод:

[('dimSales', 'Product Title', 'All'), ('test', 'Product Title', 'All')]

Объяснение:

(?:SELECT .+\({|,)      # non capture group, match SELECT folowed by 1 or more any character then ({ OR a comma
\[([\w ]+)\]            # group 1, 1 or more word character or space inside square brackets
\.                      # a dot
\[([\w ]+)\]            # group 2, 1 or more word character or space inside square brackets
\.                      # a dot
\[([\w ]+)\]            # group 3, 1 or more word character or space inside square brackets
(?=[^}]*})              # positive lookahead, make sure we have after a close curly bracket not preceeded by another curly bracket
0 голосов
/ 29 мая 2019

Как насчет этого регулярного выражения:

(\[\"[^\"]*\",\"[^\"]*\",\"[^\"]*\"\],\s*\[\"[^\"]*\",\"[^\"]*\",\"[^\"]*\"\])

демо:

https://regex101.com/r/LaddaK/2/

Пояснения:

  • круглые скобки (), чтобы иметь вашу группу захвата, могут быть удалены, если в этом нет необходимости
  • \[\"[^\"]*\",\"[^\"]*\",\"[^\"]*\"\], чтобы соответствовать открывающей скобке, за которой буквально следует двойная кавычка, от 0 до N не двойная кавычкасимволы ([^\"]*), за которыми следуют двойная кавычка и запятая.Возможно, вам придется заключить все запятые в \s*, если вы хотите принять пробелы вокруг них.
  • Вы повторяете еще 2 раза шаблон \"[^\"]*\", чтобы соответствовать первым 3 словам, заключенным в скобки (вы можетедолжны адаптироваться к \w* в зависимости от ваших точных ограничений на строки.
  • Вы повторяете весь блок [\"[^\"]*\",\"[^\"]*\",\"[^\"]*\"\] после ,\s*, чтобы принять весь шаблон, состоящий из 2 блоков скобок.

Примечания:

  • Возможно, вы захотите окружить свое регулярное выражение якорями (^ и $)

  • Я не знаю точно ваши ограничения, но если вы хотите проанализировать какой-либо JSON или проанализировать любой другой формат с повторяющимися бесконечными вложенными шаблонами (например, фракталы), вам не следуетиспользуйте regex.

РЕДАКТИРОВАТЬ после изменения требований:

import re

inputStr = '[dimSales,Product Title,All], [test,Product Title,All]'
print(re.findall(r'\[(?:[a-zA-Z0-9 ]*)(?:,[a-zA-Z0-9 ]*)*\]', inputStr))

выход:

['[dimSales,Product Title,All]', '[test,Product Title,All]']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...