4

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

  • ^([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'

如何以始终返回两组的方式组合这两个正则表达式?例如

  1. '1234'
  2. 'AB'

或者

  1. 'AB'
  2. '1234'
4

1 回答 1

3

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

^(?:([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()两个正则表达式中过滤掉空字符串或坚持使用。

于 2012-12-06T16:06:35.810 回答