[英]Regex filter numbers divisible by 3
我有一个用逗号分隔的id(digits)的列表。 我只需要得到可被3整除的这些。
Example: i = "3454353, 4354353, 345352, 2343242, 2343242 ..."
只是为了它:
reobj = re.compile(
r"""\b # Start of number
(?: # Either match...
[0369]+ # a string of digits 0369
| # or
[147] # 1, 4 or 7
(?: # followed by
[0369]*[147] # optional 0369s and one 1, 4 or 7
[0369]*[258] # optional 0369s and one 2, 4 or 8
)* # zero or more times,
(?: # followed by
[0369]*[258] # optional 0369s and exactly one 2, 5 or 8
| # or
[0369]*[147] # two more 1s, 4s or 7s, with optional 0369s in-between.
[0369]*[147]
)
| # or the same thing, just the other way around,
[258] # this time starting with a 2, 5 or 8
(?:
[0369]*[258]
[0369]*[147]
)*
(?:
[0369]*[147]
|
[0369]*[258]
[0369]*[258]
)
)+ # Repeat this as needed
\b # until the end of the number.""",
re.VERBOSE)
result = reobj.findall(subject)
将在字符串中找到所有可被3整除的数字。
如果您的意思是数字 (而不是数字 ),那么就像
re.findall(r'[369]', my_str)
对于数字列表, 没有正则表达式很容易:
lst = "55,62,12,72,55"
print [x for x in lst.split(',') if int(x) % 3 == 0]
使用这个问题的想法,我得到:
i = "1, 2, 3, 4, 5, 6, 60, 61, 3454353, 4354353, 345352, 2343241, 2343243"
for value in i.split(','):
result = re.search('^(1(01*0)*1|0)+$', bin(int(value))[2:])
if result:
print '{} is divisible by 3'.format(value)
但是,您不想为此任务使用正则表达式。
通过减少DEA [1],希望是一个完整的版本:
^([0369]|[147][0369]*[258]|(([258]|[147][0369]*[147])([0369]|[258][0369]*[147])*([147]|[258][0369]*[258])))+$
[1:] 将确定性有限自动机转换为正则表达式',C。Neumann 2005
注意:图4中有一个错别字:从q_i
到其自身的过渡应为ce*b
而不是ce*d
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.