正则表达式过滤器数字可被3整除

时间:2012-06-12 07:34:04

标签: python regex

我有一个以逗号分隔的ID(数字)列表。我只需要获得可以被3整除的这些。

Example: i = "3454353, 4354353, 345352, 2343242, 2343242 ..."

4 个答案:

答案 0 :(得分:12)

只是为了它:

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整除的所有数字。

答案 1 :(得分:9)

如果您的意思是数字(不是数字),这就像

一样简单
 re.findall(r'[369]', my_str)

对于数字列表,没有正则表达式非常容易:

lst = "55,62,12,72,55"
print [x for x in lst.split(',') if int(x) % 3 == 0]

答案 2 :(得分:2)

使用this question的想法得到:

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)

但是你不想在这个任务中使用正则表达式。

答案 3 :(得分:2)

希望完成版本,减少DEA [1]:

^([0369]|[147][0369]*[258]|(([258]|[147][0369]*[147])([0369]|[258][0369]*[147])*([147]|[258][0369]*[258])))+$

[1:] Converting Deterministic Finite Automata to Regular Expressions', C. Neumann 2005
注意:图4中有一个拼写错误:从q_i到自身的转换应该是ce*b而不是ce*d