如何修复regexp以匹配我的字符串

时间:2015-09-05 14:29:54

标签: python regex

我有以下字符串key1=[subKey1=[val1,val2=[k1,k2]],val3,val4,subKey2=[aaa,bbb]],key2=val5,key3,key4=[1,2,3]我必须解析此字符串并在循环中处理找到的数据。

我写了这个正则表达式:(([^=]+)=(\[(\S+)\],?|[a-z0-9-_]+))|([a-z0-9-_]+)但它无法捕获key1部分,因为key4表达式以]字符结尾,如何修复我的正则表达式以匹配字符串?\

regex=re.compile('(([^=]+)=(\[(\S+)\],?|[a-z0-9-_]+))|([a-z0-9-_]+)')
string="key1=[subKey1=[val1,val2=[k1,k2]],val3,val4,subKey2=[aaa,bbb]],key2=val5,key3,key4=[1,2,3]"

for i in regex.findall(string):
   #Do Stuff

3 个答案:

答案 0 :(得分:2)

Regexp不适合解析其中具有递归模式的任何内容。请改用真正的无上下文语言解析器。否则,您必须将语言限制为更简单的格式。

或尝试将其转换为JSON格式并使用JSON解析器。

答案 1 :(得分:1)

import regex
x="key1=[subKey1=[val1,val2=[k1,k2]],val3,val4,subKey2=[aaa,bbb]],key2=val5,key3,key4=[1,2,3]"
print [i for i,j in regex.findall("([^,=]+=(\[(?:[^\[\]]|(?2))+\])|[^,]*)",x) if i]

使用recursive regex模块中提供的regex

输出:['key1=[subKey1=[val1,val2=[k1,k2]],val3,val4,subKey2=[aaa,bbb]]', 'key2=val5', 'key3', 'key4=[1,2,3]']

答案 2 :(得分:0)

这是一种使用Python ast.literal_eval函数的稍微替代方法:

import ast, re

orig_text = """key1=[subKey1=[val1,val2=[k1,k2]],val3,val4,subKey2=[aaa,bbb]],key2=val5,key3,key4=[1,2,3]"""
quoted_values = re.sub(r'([a-zA-Z0-9]+)', r'"\1"', orig_text)
assignments_removed = re.sub(r'("[a-zA-Z0-9]+?"\s?=\s*)', '', quoted_values)

print ast.literal_eval(assignments_removed)

这至少可以为您提供以下所有值:

([['val1', ['k1', 'k2']], 'val3', 'val4', ['aaa', 'bbb']], 'val5', 'key3', ['1', '2', '3'])

首先引用所有值,然后删除所有分配以允许literal_eval工作。结构得以保留。