我需要在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?
答案 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