我想将以下两个正则表达式合并为一个:
^([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组,例如
''
''
'1234'
'AB'
如何以一种始终返回两个组的方式组合这两个正则表达式? e.g。
'1234'
'AB'
或
'AB'
'1234'
答案 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()
中过滤掉空字符串,或者坚持使用两个正则表达式。