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

我必须编写一个 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 False



ternaryOp('category=age<18?child:adult')

预期结果:


1

[('category=age<18?child:adult')]

True

实际结果:


6

[('category=age<18?child:adult', '', '', 'child:adult', 'child:adult', '')]

True


湖上湖
浏览 209回答 2
2回答

墨色风雨

我想我找到了适合我的解决方案。谢谢你们!re.findall(r'(?:(?:=|==|<|>|<=|>=|!=)?[\s\t]*[\s\t]*[^?:]+[\s\t]*\?[\s\t]*(?:.*?:[^&nbsp;]*))')

波斯汪

它正在做它应该做的并记录在案的事情:如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。结果中包含空匹配项。您的正则表达式有 6 个捕获组,因此每个匹配都是一个 6 元组,元组的每个元素都是一个捕获组。(?:pattern)要么使用它,要么对你不特别关心的组使用非捕获组 ( ),或者使用re.finditer产生匹配对象的组,从而获得更丰富、更灵活的结果。顺便说一句,您的工作效率非常低,如果您只想知道可以在字符串 use 中找到模式re.match,re.search那么您在此处发布的代码不需要功能,findall因为您只是在检查它是否找到任何东西.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python