2015-07-19 103 views
3

我试图匹配以下样品:可变的正则表达式匹配的字母数字

ZU2A ZS6D-9 ZT0ER-7 ZR6PJH-12 

它是字母和数字(字母数字)的组合。 下面是一个说明:

  1. 它将总是以大写字母开头(大写)z
  2. 仅由一个(1)R,S,T或U的“[R其次总是| S | T | U]“
  3. 总是只有一个(1)数字”[0-9]“
  4. 总是至少跟随一个(1)并且可选地最多三(3)个大写(大写)字母此[AZ] {1,3}
  5. 可选择后跟“ - ”和最少一个(1)和最多两个(2)数字

目前,我有这样的:

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%<! 

任何帮助,将不胜感激。

谢谢

丹尼

回答

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 
+0

在RE最后一算应该是'{1,2}'。 – user1016274

+1

为什么要关闭'?'?贪婪和非贪婪的行为会如何在这里产生影响? – user1016274

+0

@ user1016274谢谢,最后由3替换为2。 '?'只表示遵循'*'或'+'的贪婪。如果没有前面的内容,'?'是编写'{0,1}'的简短方法。 – phihag

相关问题