2012-06-17 45 views
0

我试图匹配的模式是一些字符(字母+数字+连字符(-)),然后是5位数字,然后是9位数字。图案的每个部分用连字符分隔(-) 5位和9位部分是可选的,意思是其中一个可能存在,而其他可能不存在或可能两者都存在或可能都不存在。因此,模式可以是这样的这个正则表达式有什么问题

bla-12-bla-98-bla-12345-123456789  all parts(characters+5-digit+9-digit) 
bla-bla-123-12345      9-digit part absent 
blasd-123456789      5-digit part absent 
no-1045-numeric-bla-bla    both numeric parts absent 

我想出了一个正则表达式是这个

.+(\d{5})?-?(\d{9})?$ 

的理由上面是这样的。由于开头的.+与所有字符匹配,因此(\d{5})?表示可能有0或1个5位数字部分的实例,从而使其成为可选项。

对于-?,如果两个数值部分不存在,则有woudnt是任何-但如果两个数字部分都存在,那么将有1 -所以我再次使其可选。

类似地对于(\d{9})?

但上述模式不匹配任何东西。我正在使用Python,所以group(1)group(2)返回None

上面有什么问题?

回答

2

问题是在开始时.+。正则表达式解释器无法推断.+应该结束。因此,您的模式确实符合您的要求,但您的比赛组始终是None,正如您已经观察到的那样。如果只是用

(\d{5})?\-?(\d{9})?$ 

相反,它仍然会匹配所有的例子,你的对手组将被正确识别。

+0

嘿谢谢。它的作品。但你不需要逃避那个连字符。 – lovesh

+1

你说得对。我以某种方式养成了在正则表达式中转义所有特殊字符的习惯,因为它倾向于工作,我不必担心我必须逃脱;-) –

+0

如果你在意哪些字符串在前面,你也可以做懒惰评估数字,例如把'。+?'放在你的正则表达式中。 – devsnd

相关问题