为了账号安全,请及时绑定邮箱和手机立即绑定

如果前一个匹配包含一个字符,则不匹配

如果前一个匹配包含一个字符,则不匹配

跃然一笑 2021-05-30 20:09:54
考虑来自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*?\"(.*?)\".*?(?:".*?"|\{(.*?)\})

这将匹配第一组之间的文本,""然后查找介于""或之间的内容{},如果它介于两者之间则{}捕获它。

然后,您需要检查代码中是否设置了第二个捕获组。


查看完整回答
反对 回复 2021-06-09
?
偶然的你

TA贡献1841条经验 获得超3个赞

您可以使用此正则表达式:

r'(?s)^("[^"]+").*?=> ("[^"]*"|{[^}]*})'

正则表达式演示

  • (?s):启用 DOTALL 修饰符。

  • ("[^"]+"): 匹配并捕获第一个带引号的字符串

  • ("[^"]*"|{[^}]*}): 匹配第二组可以是带引号的字符串或 {...}


查看完整回答
反对 回复 2021-06-09
?
交互式爱情

TA贡献1712条经验 获得超3个赞

在@anubhava 和@JGNI 的帮助下,我明白了:

re.findall(r'(?s)^\s*?\"(.*?)\".*?=> .*?(\".*?\"|\{.*?\})',filestring,re.MULTILINE)

这样我也能捕捉到我不想要的东西,但很容易丢弃它。


查看完整回答
反对 回复 2021-06-09
  • 3 回答
  • 0 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号