我必须编写一个 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]*(?:.*?:[^ ]*))')

波斯汪
TA贡献1811条经验 获得超4个赞
它正在做它应该做的并记录在案的事情:
如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。结果中包含空匹配项。
您的正则表达式有 6 个捕获组,因此每个匹配都是一个 6 元组,元组的每个元素都是一个捕获组。(?:pattern)
要么使用它,要么对你不特别关心的组使用非捕获组 ( ),或者使用re.finditer
产生匹配对象的组,从而获得更丰富、更灵活的结果。
顺便说一句,您的工作效率非常低,如果您只想知道可以在字符串 use 中找到模式re.match
,re.search
那么您在此处发布的代码不需要功能,findall
因为您只是在检查它是否找到任何东西.
添加回答
举报
0/150
提交
取消