【问题标题】:Regular expressions: how to use 'or' without more capturing groups?正则表达式:如何在没有更多捕获组的情况下使用“或”?
【发布时间】:2018-02-16 11:52:51
【问题描述】:

我们应该只将正则表达式添加到脚本中而不涉及其他任何内容。该脚本的制作使其接受 3 个捕获组,并且有 2 个不同的正则表达式取决于输出。我为这两种情况准备了表达式,但是当我这样做时:

expression1 | expression2

脚本认为有 6 个捕获组(每个表达式包含 3 个捕获组),因此给我一个错误。

我应该如何在没有脚本认为有 6 个捕获组的情况下加入 2 个表达式,因为这两个表达式永远无法应用,它是表达式 1 或表达式 2,但不能同时应用。

表达式1是:

([a-zA-Z0-9]+[ ]?)\(P[: ]?([a-zA-Z0-9 ]*)()

表达式2是:

()()\)[ ]+([a-zA-Z0-9]+$|[a-zA-Z0-9]+[ ])

感谢您的任何建议!

【问题讨论】:

  • 使用的正则库是re还是regex
  • 脚本的唯一库是're'
  • re 没有通用解决方案。 Saeko,请发布实际模式。
  • 不知道异或逻辑能否用Python正则表达式简洁明了地写出来。听起来改变代码的逻辑会更直接。
  • 表达式1是: ([a-zA-Z0-9]+[ ]?)(P[: ]?([a-zA-Z0-9 ]*)() 表达式2是: ()())[ ]+([a-zA-Z0-9]+$|[a-zA-Z0-9]+[ ])

标签: python regex expression capturing-group


【解决方案1】:

你有 2 个正常的选择,很少有不好的选择:

第一个正常。通过代码分开:

if (expression1) {
    DO SOMETHING
} else if (expression2) {
    DO SOMETHING
} else {
    NO MATCH FOR BOTH
}

第二正常。使用所有 6 个口袋。

if (arMatches[1] or arMatches[2] or arMatches[3]) {
    DO SOMETHING
} else if (arMatches[4] or arMatches[5] or arMatches[6]) {
    DO SOMETHING
} else {
    NO MATCH FOR BOTH
}

对于糟糕的解决方案,您可以使用非常复杂的正则表达式,这可能会有一些隐藏的错误,而且这种表达方式将非常难以维护,可能根本不可能。

【讨论】:

    【解决方案2】:

    编辑:更新后,因为第 1 组和第 2 组在第二个表达式中是空的,而第 3 组在第一个表达式中是空的,所以它们应该与非捕获组组合,并且只需删除空组:

    (?:([a-zA-Z0-9]+[ ]?)\(P[: ]?([a-zA-Z0-9 ]*)|\)[ ]+([a-zA-Z0-9]+$|[a-zA-Z0-9]+[ ]))
    

    最后一组([a-zA-Z0-9]+$|[a-zA-Z0-9]+[ ])也可以缩短

    ([a-zA-Z0-9]+(?:$|[ ]))
    

    可以使用非捕获组 (?: .. ) 代替 ( .. ) 来分组模式而不添加新组。

    如果没有关于表达式 1 和表达式 2 的更多信息,假设模式具有以下形式,则很难回答:

    exp1: (g11)s11(g21)s21(g31)
    exp2: (g12)s12(g22)s22(g32)
    

    组合表达式可以是

    (?=(?:g11)s11(?:g21)s21(?:g31)|(?:g12)s12(?:g22)s22(?:g32))((?:g11|g12))(?:s11|s12)((?:g21|g22))(?:s21|s22)((?:g31|g32))
    

    但可能会根据需要进行简化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      • 2020-03-30
      • 1970-01-01
      • 2022-08-23
      • 2016-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多