我做了这个正则表达式,并将其与re.findall()一起使用:
SELECT.*{(?:\[([a-zA-Z0-9 ]*)\]\.\[([a-zA-Z0-9 ]*)\]\.\[([a-zA-Z0-9 ]*)\][,]{0,1}){1,}}.*
以匹配这些字符串列表:
[“ 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()返回所有迭代。不仅仅是外部捕获组的最后一次迭代?
答案 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