如何获取捕获组的所有匹配迭代

时间:2019-05-29 06:29:03

标签: python regex

我做了这个正则表达式,并将其与re.findall()一起使用:

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

made with https://jex.im

以匹配这些字符串列表:

  

[“ dimSales”,“产品标题”,“全部”],   [“测试”,“产品标题”,“全部”]

在这个大海捞针中:

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

我的正则表达式仅匹配外部捕获组的最后一次迭代

  

[“测试”,“产品标题”,“全部”]

我需要更改什么,因此re.findall()返回所有迭代。不仅仅是外部捕获组的最后一次迭代?

2 个答案:

答案 0 :(得分:0)

该正则表达式如何:

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

演示:

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

说明:

  • 括号()中有您的捕获组,可以在不需要时删除
  • \[\"[^\"]*\",\"[^\"]*\",\"[^\"]*\"\]来匹配一个大括号,其后依次是双引号,0到N个非双引号字符([^\"]*),双引号和逗号。如果您想接受逗号周围的空格,则可能必须用\s*括起来。
  • 您将模式\"[^\"]*\"再重复2次,以匹配方括号中的前3个单词(根据对字符串的确切限制,您可能必须适应\w*
  • 您在[\"[^\"]*\",\"[^\"]*\",\"[^\"]*\"\]之后重复整个块,\s*,以接受由2个方括号组成的整个模式。

注释:

  • 您可能希望用锚点(^$)包围正则表达式

  •   

    我不确定您的约束条件是什么,但是如果您想分析一些JSON或使用无限嵌套模式(例如分形)来重复解析其他格式,则不应该使用正则表达式。

更改要求后进行编辑:

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]']

答案 1 :(得分:0)

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