我有以下字符串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
答案 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
工作。结构得以保留。