Regexp变量字母数字匹配

时间:2015-07-19 09:14:19

标签: regex

我正在尝试匹配以下示例:

ZU2A ZS6D-9 ZT0ER-7 ZR6PJH-12

它是字母和数字的组合(字母数字)。 这是一个解释:

  1. 它始终以大写(大写)Z
  2. 开头
  3. 始终只跟一个(1)R,S,T或U" [R | S | T | U]"
  4. 始终只跟一(1)个号码" [0-9]"
  5. 始终至少跟随一个(1)和最多三个(3)大写(大写)字母,如[A-Z] {1,3}
  6. 可选地接着" - "至少为一(1)和最多两(2)个数字
  7. 目前我有这个:

    Z[R|S|T|U][0-9][A-Z]{1,}(\-)?([0-9]{1,3})
    

    但这似乎并没有抓住所有的样本。

    编辑:以下是完整字符串的示例:

    ZU0D>APT314,ZT1ER,WIDE1,ZS3PJ-2,ZR5STU-12*/V:/021414z2610.07S/02814.02Ek067/019/A=005475!w%<!
    

    任何帮助都将不胜感激。

    谢谢

    丹尼

1 个答案:

答案 0 :(得分:5)

您的主要问题是整个可选部分应该被一组标有?(=可选)的括号所包围。总而言之,你想要

Z[RSTU][0-9][A-Z]{1,3}(?:-[0-9]{1,2})?

一些额外的说明:

  • 在字符组中,您只需列出字符即可。因此,对于2,您需要[RSTU](?:R|S|T|U)
  • (?:example)而不是(example)形式的组会阻止子表达式作为匹配项返回。它对哪些输入匹配没有影响。
  • 您不需要在字符类之外使用反斜杠转义-

这是example test case script in Python

import re

s = r'Z[RSTU][0-9][A-Z]{1,3}(?:-[0-9]{1,2})?'

rex = re.compile(s)
for test in ('ZU2A', 'ZS6D-9', 'ZT0ER-7', 'ZR6PJH-12'):
    assert rex.match(test), test

long_test = 'ZU0D>APT314,ZT1ER,WIDE1,ZS3PJ-2,ZR5STU-12*/V:/021414z2610.07S/02814.02Ek067/019/A=005475!w%<!'
found = rex.findall(long_test)
assert found == ['ZU0D', 'ZT1ER', 'ZS3PJ-2', 'ZR5STU-12'], found