奇怪的正则表达式行为 - Python

时间:2014-10-10 22:00:59

标签: python regex

为什么我的正则表达式numbers匹配$ab之类的字符串?我希望它只匹配十进制数字的序列,0-9后面跟着${$,后面跟着},第二种情况下没有任何内容。

import re

numbers = re.compile('\$\{[0-9]*\}|\$[0-9]*')       # ${ANY_SEQUENCE_OF_DIGITS} or $ANY_SEQUENCE_OF_DIGITS
if numbers.match("$ab"):
    print 'matches'

此示例代码打印'匹配'

3 个答案:

答案 0 :(得分:5)

请注意,*表示零或更多。它匹配,因为它后面有$和零数字。 match() 要求整个字符串匹配,只是开头。

如果你想匹配非空数字,之后不需要额外的数字:

numbers = re.compile(r'\$\{[0-9]+\}$|\$[0-9]+$')

这使用+要求“1个或更多”数字,以及显式$表示最后不能有额外的东西(如果你这样做,你可以将它们留下想要在最后允许额外的字符)

答案 1 :(得分:3)

你匹配$因为你有[0-9] *

你可能想要的是这个

re.compile('\$\{[0-9]+\}|\$[0-9]+')

答案 2 :(得分:0)

如果你刚才:

import re

numbers = re.compile('\$\{[0-9]*\}')       # ${ANY_SEQUENCE_OF_DIGITS} or $ANY_SEQUENCE_OF_DIGITS
if numbers.match("$ab"):
    print 'matches'

然后它不会打印"匹配"

但是,由于您添加了|\$[0-9]*,因此您实际上是在说#34;或匹配$后跟零或更多数字。" $ ab确实满足" $后跟零个或多个数字"所以找到匹配。