【问题标题】:Python Regex: Check for match and capture groupsPython Regex:检查匹配和捕获组
【发布时间】:2022-01-13 20:54:24
【问题描述】:

我想确保字符串与使用 if 语句的正则表达式匹配,并同时存储捕获组。我认为下面的代码显示了我想要的,但它在语法上是无效的。有没有办法优雅地实现以下目标?

yyyyq_format = "19984"

if regex_match = re.search("^(\d{4})(\d)$", yyyyq_format):
    found_q = regex_match[2]
else:
    raise ValueError("Format \"yyyyq\" is not followed.")

我知道以下作品(这是我唯一的选择吗?):

yyyyq_format = "19984"
regex_match = re.search("^(\d{4})(\d)$", yyyyq_format)

if regex_match:
    found_q = regex_match[2]
else:
    raise ValueError("Format \"yyyyq\" is not followed.")

【问题讨论】:

    标签: python regex if-statement


    【解决方案1】:

    PEP-572 (assignment expressions) 实现了所谓的 walrus 运算符,您可以使用它来评估表达式并将返回值一次性分配给名称,例如:

    if regex_match := re.search("^(\d{4})(\d)$", yyyyq_format):
        found_q = regex_match[2]
    else:
        raise ValueError("Format \"yyyyq\" is not followed.")
    

    注意: 之前的=

    这(将)在 Python 3.8 中可用。

    在此之前,你的第二个选择是我相信的唯一方法。

    【讨论】:

      【解决方案2】:

      Python 3.8 中的海象运算符:= 是一种选择,或者您可以使用for else 语句(注意re.finditer):

      import re
      
      yyyyq_format = "19984"
      
      for g in re.finditer("^(\d{4})(\d)$", yyyyq_format):
          found_q = g[2]
          break
      else:
          raise ValueError("Format \"yyyyq\" is not followed.")
      
      print(found_q)
      

      打印:

      4
      

      【讨论】:

      • 这只是为了检查匹配是相当昂贵的。
      • @heemayl 为什么这么贵? OP 希望将第二组分配给 found_q 或引发异常。
      • 好吧,对于初学者来说,for 循环的意义何在,当您可以通过match(2) 轻松获得所需的匹配时,如果有匹配,jsut 会检查 None。这是微不足道的和 Pythonic 的。
      • @heemayl 关键是 OP 不想在外面制作临时变量 (regex_match)。
      • 我可能是错的,但我认为这根本不贵,而且实际上正是我想要的。保证最大迭代次数为 1 次,下限为 0 次迭代
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 2013-03-06
      • 1970-01-01
      相关资源
      最近更新 更多