考虑来自CFEngine的这段代码:"test" slist => { "this", "that" },"test2" slist => { "another, "another" },"test3" string => "This one";"test4" slist => { "finally", "this" } 我想要一个 Python 代码,它将获取标识符(“test1”、“test2”等)以及{}.我带着这个:re.findall(r'^\s*?\"(.*?)\".*?\{(.*?)\}.*?',filestring,re.MULTILINE | re.DOTALL)哪个工作正常,除了它最终'finally'.'this'与 匹配"test3",而不是匹配"test4"。我试着用 loosbehind 做一些工作,这样:re.findall(r'^\s*?\"(.*?)\".*?\{(?!<.*?\".*?)(.*?)\}.*?',filestring,re.MULTILINE | re.DOTALL)希望这(?!<.*?\".*?)会排除之前有引号字符的匹配项,但它不起作用,我一直得到相同的结果。有人可以帮助我实现这一目标吗?我知道我可以做其他测试,例如测试下一行是否有slist,但我想避免它,因为有时代码有注释,如"test4"# some commentslist => { "something"}我确定将标识符与其内容匹配的唯一方法是排除具有另一个不带{}. 因此,我正在考虑使用该"标志来排除匹配项,但它并没有像我想象的那样工作。任何人都可以在这里说明一下吗?
3 回答

慕斯709654
TA贡献1840条经验 获得超5个赞
试试这个 ^\s*?\"(.*?)\".*?(?:".*?"|\{(.*?)\})
这将匹配第一组之间的文本,""
然后查找介于""
或之间的内容{}
,如果它介于两者之间则{}
捕获它。
然后,您需要检查代码中是否设置了第二个捕获组。

交互式爱情
TA贡献1712条经验 获得超3个赞
在@anubhava 和@JGNI 的帮助下,我明白了:
re.findall(r'(?s)^\s*?\"(.*?)\".*?=> .*?(\".*?\"|\{.*?\})',filestring,re.MULTILINE)
这样我也能捕捉到我不想要的东西,但很容易丢弃它。
添加回答
举报
0/150
提交
取消