为什么我的正则表达式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'
此示例代码打印'匹配'
答案 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确实满足" $后跟零个或多个数字"所以找到匹配。