【问题标题】:combining "if matched" logic from re module with use of groups()? [duplicate]将 re 模块中的“如果匹配”逻辑与使用 groups() 结合起来? [复制]
【发布时间】:2020-01-17 23:41:43
【问题描述】:

我发现自己正在编写一个看起来像这样的代码块,其中我为每一行文本检查了一堆不同的可能的正则表达式匹配。

for line in someText.splitlines():

    matchObj = re.search(lineproto, line)
    if matchObj:
        do_lineproto_stuff( matchObj.groups(1), matchObj.groups(2) )

    matchObj = re.search(inRate, line)
    if matchObj:
        do_inRate_stuff( matchObj.groups(3), matchObj.groups(4) )

    matchObj = re.search(outRate, line)
    if matchObj:
        do_outRate_stuff( matchObj.groups(5), matchObj.groups(6) )    

这很好用——似乎应该有一些更优雅的方式来执行条件以查看 if 我匹配正则表达式,如果是,则使用 groups() 构造所有一口气。但也许不是……只是好像有很多重复的代码,仅此而已……

【问题讨论】:

  • some_text 的类型是什么?至于你的问题,鉴于这是一个抽象的例子,有点难以回答。
  • 您必须提供至少一对输入/期望我们尝试
  • 旁注:这里的几行(所有search行)都有非法终端:s,并且没有必要将sometext.splitlines()包装在iter()中; for 循环,就其本质而言,总是以隐式在被迭代的事物上调用iter 开始。

标签: python regex


【解决方案1】:

PEP 572 在 Python 3.8+ 中提供了赋值表达式(:=,“海象运算符”),正是为了稍微简化这种代码。有了它,您可以简化为:

if matchObj := re.search(lineproto, line):
    do_lineproto_stuff( matchObj.groups(1), matchObj.groups(2) )

if matchObj := re.search(inRate, line):
    do_inRate_stuff( matchObj.groups(3), matchObj.groups(4) )

if matchObj := re.search(outRate, line):
    do_outRate_stuff( matchObj.groups(5), matchObj.groups(6) )

不会避免将测试与使用分开,但将代码行数减少三分之一也不错。

【讨论】:

  • 不确定为什么这被否决了,尽管问题不完美,但这正是我正在寻找的答案。我的系统是python 3.5所以我不能使用它,但是有一天......;-)
猜你喜欢
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 2019-10-24
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
相关资源
最近更新 更多