我如何结合这两个正则表达式?

时间:2012-12-06 16:04:08

标签: python regex

我想将以下两个正则表达式合并为一个:

  • ^([A-Z]{1,2}) ?([0-9]{1,4})$例如AB 1234
  • ^([0-9]{1,4}) ?([A-Z]{1,2})$例如1234 AB

我认为这很简单:

^([A-Z]{1,2}) ?([0-9]{1,4})|([0-9]{1,4}) ?([A-Z]{1,2})$

但是,上述内容总是返回4组,例如

  1. ''
  2. ''
  3. '1234'
  4. 'AB'
  5. 如何以一种始终返回两个组的方式组合这两个正则表达式? e.g。

    1. '1234'
    2. 'AB'
      1. 'AB'
      2. '1234'

1 个答案:

答案 0 :(得分:3)

首先,您的组合不太正确,因为^仅适用于第一个选项,$仅适用于第二个选项。所以你需要对交替进行分组:

^(?:([A-Z]{1,2}) ?([0-9]{1,4})|([0-9]{1,4}) ?([A-Z]{1,2}))$

现在无法使用所有正则表达式引擎完成您想要实现的目标,但有些(例如PCRE)支持特殊的交替构造,其中捕获组针对所有交替进行单独计数。这是语法:

^(?|([A-Z]{1,2}) ?([0-9]{1,4})|([0-9]{1,4}) ?([A-Z]{1,2}))$

修改

不幸的是,Python特别不支持这一点。也不是重用命名捕获组的替代方法。因此,您可能需要从match.groups()中过滤掉空字符串,或者坚持使用两个正则表达式。