数字除以4由python正则表达式

时间:2014-12-26 23:40:34

标签: python regex

我需要在python的正则表达式中编写代码,这些正则表达式将传递表示可被4整除的数字的字符串。每个可以除以4的最后两个数字的数字可以除以4 (0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96 ): 所以我写了一些代码:

import re
r = re.compile('^([048]$)|([-]{0,1}[0-9]*([12]|[16]|[20]|[24]|[28]|[32]|[36]|[40]|[44]|[48]|[52]|[56]|[60]|[64]|[68]|[72]|[76]|[80]|[84]|[88]|[92]|[96])$)')
m = r.search("32") # this is oke
m.group() # this is giving a wanted result
m = r.search("33") # here somthing is not right
m.group() # it shouldn't return 33 but it does

为什么我的代码没有按照我的意愿运行?为什么接受33?

2 个答案:

答案 0 :(得分:3)

您误解了[...] 所做的事情。他们是人物类;如果该类中的1个字符匹配,则文本匹配:

>>> import re
>>> re.search(r'[32]', '3')
<_sre.SRE_Match object; span=(0, 1), match='3'>
>>> re.search(r'[32]', '2')
<_sre.SRE_Match object; span=(0, 1), match='2'>

如果只想匹配文字文本,请不要使用字符类。

以下内容仅符合您的特定2位数字格式:

r = re.compile('^([048]$)|(-?[0-9]*(12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)$)')

这可以按预期工作:

>>> r = re.compile('^([048]$)|(-?[0-9]*(12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)$)')
>>> r.search("32")
<_sre.SRE_Match object; span=(0, 2), match='32'>
>>> r.search("33")
>>> r.search("33") is None
True

您不匹配以00结尾的数字(例如100,200等),它们也可以被4整除。

注意表达式可以进一步减少;数字0,4和8仅跟随偶数,而数字2和6总是跟随奇数:

r = re.compile('^-?(?:[048]|[0-9]*(?:[02468][048]|[13579][26]))$')

我移动了-签出以适用于所有号码。

答案 1 :(得分:1)

您可以使用此

显着减少执行路径
 # ^[+-]?(?:0*[048]|[0-9]*(?:[02468][048]|[13579][26]))$

 ^                   # BOS
 [+-]?               # Optional plus or minus
 (?:
      0* [048]            # just a resultant 0, 4, 8
   |  
      [0-9]*              # any amount of any number
      (?:
           [02468] [048]       # even
        |  [13579] [26]        # or, odd
      )
 )
 $                   # EOS
相关问题