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

Python regex findall() 返回不需要的子字符串(包括正确答案)

Python regex findall() 返回不需要的子字符串(包括正确答案)

湖上湖 2022-01-18 17:24:52
我必须编写一个 python 函数,它获取一行代码作为输入,如果该行包含三元运算符(并计算它们!),则返回 true,否则返回 false。我写了几个版本的正则表达式,在这个网站https://regexr.com/上运行良好,但例如在 Google Colab 上,它们都不起作用。def ternaryOp(line):  found_operator=re.findall(r'(((=|==|<|>|<=|>=|!=)[\s\t]*)?[\s\t]*.+[\s\t]*\?[\s\t]*((.+:.*)|(.*:.+)))',line)  if found_operator:      print(len(found_operator))      print(found_operator)      return True  else:    return FalseternaryOp('category=age<18?child:adult')预期结果:1[('category=age<18?child:adult')]True实际结果:6[('category=age<18?child:adult', '', '', 'child:adult', 'child:adult', '')]True
查看完整描述

2 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

我想我找到了适合我的解决方案。谢谢你们!

re.findall(r'(?:(?:=|==|<|>|<=|>=|!=)?[\s\t]*[\s\t]*[^?:]+[\s\t]*\?[\s\t]*(?:.*?:[^ ]*))')


查看完整回答
反对 回复 2022-01-18
?
波斯汪

TA贡献1811条经验 获得超4个赞

它正在做它应该做的并记录在案的事情

如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。结果中包含空匹配项。

您的正则表达式有 6 个捕获组,因此每个匹配都是一个 6 元组,元组的每个元素都是一个捕获组。(?:pattern)要么使用它,要么对你不特别关心的组使用非捕获组 ( ),或者使用re.finditer产生匹配对象的组,从而获得更丰富、更灵活的结果。

顺便说一句,您的工作效率非常低,如果您只想知道可以在字符串 use 中找到模式re.matchre.search那么您在此处发布的代码不需要功能,findall因为您只是在检查它是否找到任何东西.


查看完整回答
反对 回复 2022-01-18
  • 2 回答
  • 0 关注
  • 208 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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